You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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作为序列化工具的话,可以给对应的实体类加上注解:
    @JsonIgnoreProperties(value = {"$jacocoData"}, ignoreUnknown = true)
    public class InquiryRequest {
      // 类原有内容
    }
    
    也可以在全局ObjectMapper配置中添加规则,序列化时自动忽略所有以$开头的字段。
  • 方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:39:03