执行mvn clean install跑JUnit测试遇ComparisonFailure,多出$jacocoData字段
问题原因分析
你当前测试用例中使用了@Mock注解生成的InquiryRequest代理对象,Jacoco在做测试覆盖率插桩时,会给代理类自动注入名为$jacocoData的字段用于统计覆盖率信息。OfferUtils.createJsonRequest方法内部做JSON序列化时,会把这个额外字段也序列化到结果中,最终导致断言失败。
另外你提到inquiryRequest是读取resource下JSON构建的真实实例,但当前测试代码里你用的是Mock生成的代理对象,二者不是同一个实例,这是核心错误点。
解决方案
- 方案1:替换Mock对象为真实实例(最推荐)
直接调用你项目中读取resource目录JSON构建InquiryRequest的工具方法,拿到真实的业务对象传入测试方法,完全规避代理对象的插桩字段问题,同时更符合单元测试的真实业务场景验证要求。 - 方案2:修改JSON序列化配置过滤额外字段
如果确实需要使用Mock对象测试,可以调整你项目中JSON序列化工具的配置,过滤掉$jacocoData字段。比如使用Jackson作为序列化工具的话,可以给对应的实体类加上注解:
也可以在全局ObjectMapper配置中添加规则,序列化时自动忽略所有以@JsonIgnoreProperties(value = {"$jacocoData"}, ignoreUnknown = true) public class InquiryRequest { // 类原有内容 }$开头的字段。 - 方案3:调整Jacoco插桩规则
在pom.xml的Jacoco插件配置中,添加规则排除你项目中的实体类/VO类的插桩,这类类不需要做覆盖率统计,也就不会被注入$jacocoData字段,参考配置示例:<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <configuration> <excludes> <exclude>**/entity/**/*</exclude> <exclude>**/vo/**/*</exclude> </excludes> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者kumar001
相关产品推荐
相关产品推荐

