Testng,Emma,Cobertura,coverage和JDK 7导致ClassFormatError和VerifyError

Jag*_*ger 55 code-coverage emma cobertura java-7 jacoco

我已经切换到最新的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)
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一篇文章JSR 292 Goodness Fast Code Coverage Tool Less 10k,它说"JSR 292引入了一个新的字节码指令invokedynamic,但也有几种新的常量池常量.这意味着大多数解析字节码的工具都像ASM,BCEL,findbugs或EMMA需要更新为兼容java 7."

检查了艾玛的主页,但看起来它已经很久没有更新了.

有人解决了类似的问题吗?

我也曾尝试过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)
Run Code Online (Sandbox Code Playgroud)

Ped*_*ros 76

我使用maven cobertura插件时遇到了同样的问题.从cobertura运行时,所有测试都失败了:报告.但是直接从surefire插件运行所有测试都成功了.正如你们中的一些人已经说过的问题是,coberture字节码检测与JDK7不兼容.

你可以在这里看到http://vikashazrati.wordpress.com/2011/10/09/quicktip-verifyerror-with-jdk-7/说:"与StackMapTable属性的新类型检查"的异常有关(参见:-X :http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html中的+ 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>
Run Code Online (Sandbox Code Playgroud)

  • 将其添加到Eclipse"Coverage Configurations ..."中的"VM Arguments"中.效果很好. (5认同)

wie*_*990 5

我遇到过同样的问题.幸运的是beta可与JDK 7一起使用.
更新站点链接:http ://download.eclipselab.org/eclemma/beta/2.0.0/update/
此链接应在Eclipse中使用:

Help -> Install new software... -> Add...
Run Code Online (Sandbox Code Playgroud)


休息应该很容易;)