升级至Spring Boot 3后测试覆盖率为0%的问题求助
Spring Boot 3升级后SonarQube显示JUnit测试覆盖率0%的排查方案
1. 调整Jacoco报告生成阶段
你的Jacoco插件将report目标绑定到了post-integration-test阶段,但JUnit单元测试是在test阶段执行的,这会导致Jacoco无法正确捕获单元测试的覆盖数据(集成测试阶段的执行数据不会包含单元测试内容)。
修改Jacoco插件的coverage-report执行阶段为verify(单元测试完成后的阶段):
<execution> <id>coverage-report</id> <phase>verify</phase> <!-- 替换原post-integration-test --> <goals> <goal>report</goal> </goals> </execution>
2. 确保SonarQube正确读取Jacoco报告
SonarQube需要明确指定Jacoco报告路径才能加载覆盖数据,在sonar-maven-plugin中添加以下配置:
<plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.9.1.2184</version> <!-- 适配你的Sonar版本 --> <configuration> <!-- 指定Jacoco XML报告路径(Jacoco 0.8.7+推荐使用XML格式) --> <sonar.jacoco.xmlReportPaths>${project.build.directory}/jacoco/jacoco.xml</sonar.jacoco.xmlReportPaths> </configuration> </plugin>
同时确保Jacoco生成XML格式报告,可在report目标中补充配置:
<execution> <id>coverage-report</id> <phase>verify</phase> <goals> <goal>report</goal> </goals> <configuration> <formats> <format>XML</format> <format>HTML</format> <!-- 保留HTML方便本地查看 --> </formats> </configuration> </execution>
3. 规范Azure Pipeline的Maven执行顺序
在Azure Pipeline的任务中,必须保证Maven命令按以下顺序执行,确保Jacoco代理全程捕获测试数据:
mvn clean test jacoco:report sonar:sonar
避免拆分命令(比如单独执行test再执行sonar:sonar),这会导致Jacoco的代理上下文丢失,无法生成有效覆盖数据。
4. 修复Mockito版本兼容性问题
你使用的Mockito 4.1.0与JUnit 5.9.2、Spring Boot 3.2.5存在版本兼容冲突,Spring Boot 3.2.x默认依赖Mockito 5.x,升级Mockito版本到5.11.0或以上:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>5.11.0</version> <scope>test</scope> </dependency>
版本不兼容可能导致部分测试未正常执行,间接导致覆盖率显示为0。
5. 本地验证覆盖数据生成
在本地执行mvn clean test jacoco:report,查看target/site/jacoco目录下的HTML报告:
- 如果本地报告也显示覆盖率0,说明问题出在测试执行或Jacoco配置,而非SonarQube集成
- 检查Maven控制台输出的测试数量,确认测试类是否被正确执行
- 确保测试类命名符合Maven默认规则(以
Test结尾或位于src/test/java目录下)
内容的提问来源于stack exchange,提问作者user2176576
相关产品推荐
相关产品推荐

