我正在尝试使用EMMA来测量一些使用JMockit的JUnit测试的覆盖率。但是当我在使用EMMA进行仪器测试后尝试运行JMockit测试时,大约四分之一的测试失败并出现以下错误:
com.logstorage.engine.sensor.SensorManagerTest.setUpBeforeClass(SensorManagerTest.java:98)
java.lang.ClassFormatError
at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:150)
at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:152)
at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:139)
at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:73)
at mockit.Mockit.setUpMock(Mockit.java:235)
at com.myapp.MyTest.setUpBeforeClass(MyTest.java:98)
我看不出哪些测试失败,哪些测试失败的模式。我想这只是JMockit中的一个错误,但有人知道解决方法吗?
我发现了一个非常类似的问题,称为“使用EMMA获取ClassFormatError?”但解决方案对我不起作用(我没有使用任何reentrant = true模拟方法)。还有其他想法吗?
提前致谢。
答案 0 :(得分:2)
我一直遇到同样的问题 - 这似乎已经为我解决了这个问题,并希望能帮助其他人。
如果您通过ant
运行此操作,请确保vars
目标的javac
参数中没有debuglevel
。以下目标将导致错误。
<javac srcdir="${src}" destdir="${bin}" debug="on" debuglevel="lines,source,vars" nowarn="true" />
将其更改为:
<javac srcdir="${src}" destdir="${bin}" debug="on" debuglevel="lines,source" nowarn="true">
这可能是一个JMockit错误 - 非常微妙而且难以找到。
答案 1 :(得分:0)
我今天才看到这个问题,但是如果可以的话,给我发一些测试,在运行EMMA时抛出ClassFormatError,我会尝试在JMockit中找到bug。
顺便问一下,您是否尝试过使用JMockit Coverage?只需将jmockit-coverage.jar添加到类路径中,看看你得到了什么。通常,这将在工作目录下的“coverage-report”目录中生成(无需任何额外配置)良好的HTML覆盖率报告。它不能比这更容易!
答案 2 :(得分:0)
我的团队遇到了同样的问题。具体案例是:使用jMockit来模拟在TeamCity下运行的单元测试套件中的类的静态方法,其中EMMA作为覆盖工具。解决方案如下:
为每个模拟静态方法的测试添加一个拆卸方法:
@After
public void tearDown() throws Exception {
Mockit.tearDownMocks(ClassWithStaticMethods.class);
}
答案 3 :(得分:0)
将jmockit从1.5更新为任何最新版本。