背景介绍
单元测试本地执行正常,但服务器上执行verify流水线就失败,原因是某个数字转换失败。
根据错误信息,跟踪到代码发现,转换异常的值是根据反射获取到对象的值信息,获取到值后进行数字转换异常了。但是该对象的属性都是数字类型,按道理不会有这种情况才是。
问题
- 为什么本地执行没有问题,而一上服务器执行单元测试就异常?
- mock对象的属性都是数字类型,且都赋了正常的值,为什么会转换失败?
排查
- 问题复现,找不同:服务器上通过maven命令执行的单元测试,而本地都是通过idea自带的junit插件执行的。本地换成mvn -Dtest命令执行发现果然出现异常了。
- 打印字段信息,发现使用mvn命令执行单元测试,mock对象中莫名其妙多了$jacocoData字段,是boolean[]类型的。而我们代码里面又是通过反射获取值,并转换成number类型,所以导致异常。
- 大概知道这个和jacoco代码覆盖率工具有关。使用idea的执行单元测试是idea自带的覆盖率工具。由于项目上maven引入了jacaca插件,用maven命令执行是使用了jacoco覆盖率插件。所以导致一开始线上线下执行的结果不一致。
- 对jacoco了解不深,大概是这个意思:为统计覆盖率jacoco在运行时修改字节码,给对象增加一个静态字段$ jacocoData。
解决
- 使用f