配置JMockit与Jacoco时无法生成测试覆盖率报告求助
问题解决:JMockit + Jacoco + TestNG 覆盖率报告生成失败及NPE问题
问题根源
Jacoco和JMockit都依赖Java Agent实现字节码操作,二者的Agent参数需要同时注入JVM启动参数。原配置中硬写JMockit的argLine会覆盖Jacoco自动注入的Agent参数,导致Jacoco无法收集覆盖率数据,触发"Skipping JaCoCo execution due to missing execution data file"提示;若移除JMockit的argLine配置,JMockit无法获取Instrumentation实例,就会抛出mockit.internal.startup.Startup.instrumentation空指针异常。
解决方案
调整Maven Surefire插件的argLine配置,合并Jacoco与JMockit的Agent参数:
- 修改maven-surefire-plugin的argLine配置
把硬编码的JMockit Agent参数改成继承Jacoco自动注入的参数,再追加JMockit的Agent配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${surefire.version}</version> <configuration> <!-- 用@{argLine}继承Jacoco的Agent参数,再追加JMockit的Agent --> <argLine>@{argLine} -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar</argLine> <suiteXmlFiles> <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile> </suiteXmlFiles> </configuration> </plugin>
- 确保Jacoco插件配置正确
Jacoco插件需绑定到verify阶段,保证测试执行后生成数据文件:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco.version}</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>verify</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin>
验证步骤
执行以下Maven命令:
mvn clean verify site
执行完成后,就能在target/site/jacoco目录下找到生成的覆盖率报告。
内容的提问来源于stack exchange,提问作者Manoj Madushanka
相关产品推荐
相关产品推荐

