是否有任何有效的变体来测试包含predicate
的控制器?
@RestController
public class QueryLauncherController {
private QueryLauncherService queryLauncherService;
@Autowired
public QueryLauncherController(QueryLauncherService queryLauncherService) {
this.queryLauncherService = queryLauncherService;
}
@GetMapping("/queryLauncher/CMP")
public List<QueryLauncherDto> getLaunchersCompany(RTAdmin admin) {
return queryLauncherService.getLaunchersList(admin, QueryLauncher::getIsCompany);
}
}
我试图使用any(Predicate.class)
解决这个问题,但 IDE 将其突出显示为未检查的分配,它看起来很愚蠢。我为测试编写的代码是:
public void returnCompanyLinks_When_companyRequested() throws Exception {
when(queryLauncherService.getLaunchersList(eq(user), any(Predicate.class))).thenReturn(queryLauncherDtos);
mockMvc.perform(get(QUERY_LAUNCHER_URL + CMP).session(mockSession))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(content().json(new Gson().toJson(queryLauncherDtos)));
}
目标是仅在QueryLauncher::getIsInvestor
List<QueryLauncherDto> getLaunchersList(RTAdmin admin, Predicate<QueryLauncher> launcherType);
有什么变体可以做到这一点吗?
我相信
这会做你想要的:
doReturn(queryLauncherDtos).when(queryLauncherService).getLaunchersList(eq(user),
ArgumentMatchers.<Predicate<QueryLauncher>>anyObject());
一些注意事项:
- 在指定模拟功能时,我更喜欢
doReturn(value).when(mock).method
形式,但是很容易翻转到when(mock.method).thenReturn(value)
形式。 - anyObject 在最新版本的 Mockito 中被弃用。它仍然存在,但它已被弃用。
编辑:我阅读了 2.23 版本的 Mockito 文档,它提到anyObject
只是any
方法的别名。
以下内容应该有效且不推荐使用:
doReturn(queryLauncherDtos).when(queryLauncherService).
getLaunchersList(eq(user),
ArgumentMatchers.<Predicate<QueryLauncher>>any());