我已经切换到最新的 JDK 7,并且在使用 emma 覆盖工具处理的字节码上运行 testng 单元测试时遇到问题。我的测试用例都没有正确运行,并且对于大多数测试用例,我都收到了此类错误。
java.lang.ClassFormatError: Illegal local variable table length 10 in method measurement.meter.AbstractSerialPortMeter.<init>(Lmeasurement/meter/SerialPort;)V at measurement.meter.Elc3133aTest.setUp(Elc3133aTest.java:42)
我在这里找到一篇文章JSR 292 Goodness Fast Code Coverage Tool Less 10k , 也就是说,“JSR 292 引入了新的字节码指令 invokedynamic,而且还引入了几种新的常量池常量。这意味着大多数解析字节码的工具(如 ASM、BCEL、findbugs 或 EMMA)需要更新为 java 7兼容。”
查看了Emma的主页,好像已经很久没有更新了。
有人解决过类似的问题吗?
我也尝试过 Cobertura。它看起来工作得更好一些,但我收到了很多 VerifyError
类型的异常。
java.lang.VerifyError: Expecting a stackmap frame at branch target 85 in method measurement.meter.AbstractSerialPortMeter.close()V at offset 26
at measurement.meter.AbstractSerialPortMeterTest.setUp(AbstractSerialPortMeterTest.java:27)
最佳答案
我在使用 Maven cobertura 插件时遇到了同样的问题。从 cobertura:report 运行时,所有测试均失败。但是当直接从 Surefire 插件运行时,所有测试都成功了。正如你们中的一些人已经说过的,问题是 coberture 字节码检测与 JDK7 不兼容。
你可以在这里看到http://vikashazrati.wordpress.com/2011/10/09/quicktip-verifyerror-with-jdk-7/该异常与“具有 StackMapTable 属性的新类型检查器”相关(请参阅 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html 中的 -X:+UseSplitVerifier JVM 选项)。
所以我的解决方案是配置surefire-plugin始终使用JVM arg“-XX:-UseSplitVerifier”执行测试。无论有没有cobertura检测,它都可以很好地工作。
我在 Maven 中的可靠配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<argLine>-XX:-UseSplitVerifier</argLine>
</configuration>
</plugin>
关于code-coverage - Testng、Emma、Cobertura、覆盖率和 JDK 7 导致 ClassFormatError 和VerifyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7010665/