单元测试线上线下结果不一样,测试对象莫名多出$jacocodata属性

单元测试在本地IDE正常,但在服务器上执行失败,原因是一个数字转换异常。排查后发现,使用Maven命令执行时,Mock对象多出了一个布尔型的$jacocodata字段,导致反射转换失败。问题与JaCoCo代码覆盖率工具有关,它在运行时修改字节码添加静态字段。解决方案是在反射时检查字段是否为合成字段,以确保兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景介绍

单元测试本地执行正常,但服务器上执行verify流水线就失败,原因是某个数字转换失败。
根据错误信息,跟踪到代码发现,转换异常的值是根据反射获取到对象的值信息,获取到值后进行数字转换异常了。但是该对象的属性都是数字类型,按道理不会有这种情况才是。

问题

  1. 为什么本地执行没有问题,而一上服务器执行单元测试就异常?
  2. mock对象的属性都是数字类型,且都赋了正常的值,为什么会转换失败?

排查

  1. 问题复现,找不同:服务器上通过maven命令执行的单元测试,而本地都是通过idea自带的junit插件执行的。本地换成mvn -Dtest命令执行发现果然出现异常了。
  2. 打印字段信息,发现使用mvn命令执行单元测试,mock对象中莫名其妙多了$jacocoData字段,是boolean[]类型的。而我们代码里面又是通过反射获取值,并转换成number类型,所以导致异常。
  3. 大概知道这个和jacoco代码覆盖率工具有关。使用idea的执行单元测试是idea自带的覆盖率工具。由于项目上maven引入了jacaca插件,用maven命令执行是使用了jacoco覆盖率插件。所以导致一开始线上线下执行的结果不一致。
  4. 对jacoco了解不深,大概是这个意思:为统计覆盖率jacoco在运行时修改字节码,给对象增加一个静态字段$ jacocoData。

解决

  1. 使用f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值