在做单元测试覆盖率统计时,报错如下
java.lang.VerifyError:
Expecting a stackmap frame at branch target 83
Exception Details:
Location:
com/example/xx/CalculatorService.service1(Ljava/lang/String;)Ljava/lang/String; @28: ifeq
Reason:
Expected stackmap frame at this location.
Bytecode:
0x0000000: 033d 11ff ff3e 120e 1100 0eb8 0014 121e
.....
问题解决
工程使用的是网上的pom配置
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.5.1</version>
...
</plugin>
- 百度后一大把方案都是: jdk1.7添加 -XX:-UseSplitVerifier; jdk1.8或以上添加参数:-noverify;
- 添加以上java配置参数后,亲测无效果。
为避免后续开发同学遇到类似错误而不知所措,解决方案记录如下:
- 更改cobertura-maven-plugin的版本为2.7后解决,_ !
原因分析
- cobertura原理简析:为了统计覆盖率,cobertura对编译后的class文件进行了增强,生成了新的class文件。后续测试用例执行过程中,调用的是增强类,来进行覆盖率的统计
- cobertura-maven-plugin版本比较旧了,跟jdk8的兼容问题导致开篇时的错误。