java.lang.IllegalStateException: JMockit没有正确初始化;请检查jmockit.jar在类路径中是否先于junit.jar。

7

当我尝试运行Junit测试用例时,出现以下异常。如果我更改类路径条目顺序,则可以正常工作,但是Jococo覆盖率无法正常工作,并且会卡住。请问有人可以帮助解决此问题吗?

<classpathentry kind="lib" path="libt/junit-4.8.2.jar"/>
<classpathentry kind="lib" path="lib/jmockit.jar"/>
java.lang.IllegalStateException: JMockit wasn't properly initialized; check that jmockit.jar precedes junit.jar in the classpath (if using JUnit; if not, check the documentation)
    at com.amica.bc.testutil.BillingCenterTestUtil$1.<init>(BillingCenterTestUtil.java:18)
at com.amica.bc.testutil.BillingCenterTestUtil.setCurrentUserName(BillingCenterTestUtil.java:18)
    at amica.util.logging.TestAmicaGWLogger.setUp(TestAmicaGWLogger.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
4个回答

5

症状: 在Java项目中使用JMockit和JUnit运行Maven时出现错误。

消息: JMockit没有正确初始化;请检查classpath中的jmockit.jar是否先于junit.jar(如果使用JUnit;如果不是,请查看文档)。

原因:

POM.xml文件配置错误。Jmockit依赖项在JUnit之后。

解决方案:

编辑POM.xml文件。jmockit.jar应该先于junit.jar,然后jmockit依赖项应该在JUnit之前。


同时确保您的构建路径中没有包含JUnit库。我在我的构建路径中包含了JUnit库,并且在我的pom.xml文件中有JUnit和JMockit依赖项(JMockit在JUnit之前)。从构建路径中删除额外的JUnit库解决了我的问题。 - visrahane

4

官方指南告诉我们以下内容:

JMockit 还需要使用 -javaagent JVM 初始化参数;如果使用 Maven Surefire 插件进行测试执行,则需要指定如下:

<plugins>
   <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.21.0</version> <!-- or some other version -->
      <configuration>
         <argLine>
            -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
         </argLine>
         <!-- ... -->
      </configuration>
   <plugin>
   <!-- ... -->
<plugins> 

更多详情在这里以及在这里


2
我在运行需要 junit-4.8.1.jarjmockit-0.999.4.jar 两个jar包的独立应用程序时遇到了类似的问题。以下是我采取的步骤使其正常工作:

1. 打开 pom.xml 文件。点击 depdendency hierarchy 选项并在搜索栏中输入 "junit"。从这里您将知道 "junit" 是从哪个依赖项中获取的。在我的项目中,我发现 "nature-6.51" 依赖项负责此操作(请记下您的内容)。

junit dependency

2. 在搜索栏中输入 "jmockit" 并记下此处显示的依赖项(jmockit-0.999.4)

jmockit dependency

3. 转到 pom.xml 文件并搜索 "nature"(或负责 junit 的依赖项)和我们在步骤#1和#2中记下的 "jmockit" 依赖项。您将看到 nature 依赖项将列在 jmockit 依赖项之上。

4. 现在只需复制 jmockit 依赖项 并将其放置在 nature-6.51 依赖项的上方(因为在我的项目中,nature 的 jar 包携带了 junit)

这对我成功起作用了。 :)


1
在我的情况下,问题是测试被定义在main源文件夹中,而不是test源文件夹中。 jmockit和junit的依赖项在pom中被定义为测试范围。因此,它们对于这个测试不可用。
IDE在编辑和编译期间并不那么严格,因此没有任何警告,但是测试失败并出现了相同的奇怪错误。

所有修改测试类的模拟工具都会遇到与JaCoCo相同的问题。我们成功地使用Mockito与JaCoCo结合进行模拟。只要不使用spy()功能来拦截测试类,这种方法就可以正常运行。 - user1166528

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接