使用JMockit和EMMA的ClassFormatError

时间:2009-05-25 01:34:22

标签: jmockit emma

我正在尝试使用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模拟方法)。还有其他想法吗?

提前致谢。

4 个答案:

答案 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更新为任何最新版本。