对于比较难以获取的对象,我们可以通过mock的形式直接给对象赋值,当代码运行到这个地方时,会跳过方法,直接用我们mock的值。
以下几个注意事项:
1、对于比较难获取的对象,可以采用mock的方式获取
// 模拟SseRestTemplateUtil的postInApp方法
when(SseRestTemplateUtil.postInApp(anyString(), any(), any(RequestParams.class), eq(ResponsePage.class)))
mock出来的数据 后续对象会直接赋值,不会去查询。查询条件是匹配任何条件。
2、方法的调用:invoke形式调用
Method method = PowerMockito.method(
BillRecognitionDomainService.class,
"fillExpenseUserId",
ExpenseItemVO.class,
ExpenseBillVO.class
);
method.invoke(
billRecognitionDomainService,
expenseItem,
billVO
);
3、结果比对:
assertEquals(123456, expenseItem.getExpenseUserId());
assertNull(expenseItem.getExpenseUserId());
4、对于方法所在的 service类,要注入进来
@InjectMocks
private BillRecognitionDomainService billRecognitionDomainService;
5、当代码不会出现异常时,可以构建异常
PowerMockito.mockStatic(DateUtil.class);
when(DateUtil.dateToDate(any(), any()))
.thenThrow(new ParseException("sss",0));
6、注意隐藏条件里面的分支:
if (!list.isEmpty() && list.size() == ClaimConstant.NUMBER_INT_1)
7、对于lambda表达式里面的判断语句,UT测试用例也得考虑到所有的情况,才能保证整个测试用例的通过。例如表达式里面有filter语句,涉及到判断的地方都需要在入参中考虑到。