目录
一、command line is too long
错误如图
解决方法
二、因为service初始化方法中执行了另一个私有方法去数据库获取配置赋值给一个私有变量,导致 NullPointerException 错误,初始化前mock没有找到可行方案
学习了反射之后解决了这个问题
@InjectMocks
private ClassB b; //ClassB中有全局变量 private ClassA a;
setUP(){
ClassA a = new ClassA();
// 给ClassA中的变量赋值或其他操作
ReflectionTestUtils.setField(b,"a",a)
}
三、can not find lambda cache for this entity
这里报错的位置是被测试代码中获取实体类属性值时
someMapper.selectList(new QueryWrapper<ExamplePo>().lambda().orderByDesc(ExamplePo::getId));
解决方法
在 Mockito.doReturn().when() 前加载一下表,比较推荐放在@Before
TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(),""), ExamplePo.Class); //加载ExamplePo
Mockito.doReturn(result).when(someMapper).selectList(Mockito.any()); //参数值应该与实际参数类型匹配一下
四、使用@SpringBootTest导致devops pipeline测试覆盖率为0
由于测试的接口使用了HttpServletRequest 以及redisService,原本的@ExtendWith(MockitoExtension.class)无法正常启动测试,查到需要改用@SpringBootTest注解
本地测试无误,覆盖率也正常,但是提交到devops流水线执行出来的覆盖率是0
做如下更改后测试正常启动且覆盖率恢复正常
五、junit赋值私有属性及调用私有方法
ClassA classA = new ClassA(); //测试classA
Field fieldA = classA.getClass().getDeclaredField("paramName");
fieldA.setAccessible(true);
fieldA.set(classA,"paramValue");
Method methodA = classA.getClass().getDeclaredMethod("methodName", MethodParamA.class);
methodA.setAccessible(true);
methodA.invoke(classA,methodParamA);
//私有方法举例,对应以上的示例
private void methodName(MethodParamA methodParamA) {}