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 中的一个错误,但有人知道解决方法吗?

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

提前致谢。

4

4 回答 4

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 错误 - 非常微妙且难以发现。

于 2009-05-29T02:13:19.707 回答
0

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

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

于 2009-06-30T22:27:26.023 回答
0

我的团队也有同样的问题。具体案例是:使用 jMockit 模拟来自在 TeamCity 下运行的单元测试套件中的类中的静态方法,并使用 EMMA 作为覆盖工具。解决方案如下:

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

@After
public void tearDown() throws Exception {
  Mockit.tearDownMocks(ClassWithStaticMethods.class);
}
于 2010-09-23T14:27:16.753 回答
0

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

于 2016-08-16T05:19:57.480 回答