使用EMMA和JMockit时出现的ClassFormatError错误

4

我正在尝试使用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中的一个bug,但有人知道解决方法吗?

我发现一个非常类似的问题叫做“使用EMMA时出现ClassFormatError?”但是解决方案对我不起作用(我没有使用任何reentrant=true的模拟方法)。还有其他想法吗?

提前致谢。


这一定是月球的对齐问题。两天前我什么都没改,可就没有出现这个错误! - Cem Catikkas
4个回答

2
我一直遇到同样的问题-这似乎已经解决了我的问题,希望也能帮助其他人。如果您通过 ant 运行此操作,请确保在 javac 目标的 debuglevel 参数中没有 vars 。以下目标将导致错误。
<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的一个bug - 非常微妙并且令人讨厌难以发现。


成功了!你真是我的救星!这个问题我已经放弃修复了,认为它是“无法修复的” :) - Chris B

0

我的团队也遇到了同样的问题。具体情况是:在使用 jMockit 模拟静态方法时,在 TeamCity 下运行单元测试套件并使用 EMMA 作为覆盖工具。解决方案如下:

为每个模拟静态方法的测试添加一个清除方法:

@After
public void tearDown() throws Exception {
  Mockit.tearDownMocks(ClassWithStaticMethods.class);
}

0

将 jmockit 从 1.5 版本升级到任何最新版本。


0

我今天才看到这个问题,但如果可以的话,请给我发送一些在使用EMMA运行时引发ClassFormatError的测试,我将尝试在JMockit中找到错误。

顺便说一下,您是否尝试过使用JMockit覆盖率?只需将jmockit-coverage.jar添加到类路径中,然后查看您获得的内容。通常,这将在工作目录下的“coverage-report”目录中生成一个漂亮的HTML覆盖报告(无需任何额外配置)。再也没有比这更简单的了!


谢谢你的提议,但这个问题是我在工作中的一个项目上遇到的,我不认为我的公司会喜欢我把源代码发送给你。如果我能够制作出一个示例测试来展示这个问题,我会告诉你的。我还没有尝试过JMockit Coverage,我会去试试看!我使用EMMA的主要原因是它有很好的Eclipse和Hudson插件。 - Chris B
嘿,Rogerio,让我看看能否为你提供一个代表性的类来重现这个问题。 - Cem Catikkas

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