Quarkus集成JaCoCo时Repository包覆盖率统计为0%的问题排查
根本原因
这不是CDI代理层级的问题,核心是Quarkus Panache的字节码增强机制和JaCoCo的类匹配逻辑存在天然冲突:
- 为什么Repository类统计不到覆盖率
- Quarkus在构建测试可运行应用的阶段,会对所有实现
PanacheRepositoryBase的类做字节码改写,直接生成带持久化逻辑的增强版Repository类,运行时JVM加载的是这个被改写后的类,完全不是你项目源码编译输出的原始Repository类文件。 - JaCoCo生成报告时,默认扫描的是
build/classes目录下的原始未改造Repository类,但它收集到的测试执行轨迹,对应的是运行时被增强类的字节码校验和、类结构。两者的类标识(字节码哈希值)完全不匹配,JaCoCo没法把收集到的执行数据关联到扫描到的原始类上,最终就会显示Repository包覆盖率为0%。
- Quarkus在构建测试可运行应用的阶段,会对所有实现
- 为什么其他层(Controller、Service)统计正常
这些被@ApplicationScoped标记的类,Quarkus只会基于原始类生成CDI代理子类,不会替换原始类本身,原始类的字节码结构和哈希值没有改动,因此JaCoCo可以正常把执行数据和类文件匹配上,统计结果准确。 - 为什么你尝试的离线插桩方案没用
你做的离线插桩,是在Quarkus对类做增强之前,就给原始Repository类植入了覆盖率探针。但后续Quarkus的构建流程会直接用增强后的类替换掉你插桩的版本,测试运行时根本加载不到你插桩的类,自然收集不到任何覆盖率数据。
常见解决思路
- 调整JaCoCo的类扫描路径,把默认扫描的原始编译输出目录,替换为Quarkus经过字节码增强后的类输出目录,保证报告扫描的类和运行时加载的类是同一个版本。
- 升级JaCoCo到0.8.8及以上版本,适配Quarkus新版本的字节码增强兼容规则,解决类校验和不匹配的问题。
- 若坚持用离线插桩方案,要把插桩步骤放到Quarkus完成类增强之后执行,保证测试运行时加载的类就是被植入探针的增强版类。
内容的提问来源于stack exchange,提问作者elias
相关产品推荐
相关产品推荐

