【问题标题】:ClassFormatError using JMockit with EMMAClassFormatError 使用 JMockit 和 EMMA
【发布时间】:2009-05-25 01:34:22
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 一定是月亮的排列。没有任何改变,两天前我没有收到此错误!

标签: jmockit emma


【解决方案1】:

我也遇到了同样的问题——这似乎已经为我解决了,希望也能帮助其他人。

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

【讨论】:

  • 成功了!你是救生员!这是我因为“无法修复”而放弃的东西:)
【解决方案2】:

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

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

【讨论】:

  • 感谢您的提议,但这个问题出在一个工作项目上,我认为我的公司不会对我向您发送源代码片段感到满意。如果我设法做一个展示问题的示例测试,我会告诉你的。我还没有尝试过 JMockit Coverage。我会检查出来的!我使用 EMMA 的主要原因是它为 Eclipse 和 Hudson 提供了很好的插件。
  • 嗨,罗杰里奥,让我看看能不能给你找一个有代表性的班级来重现这个。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多