如何从 Spring 控制器测试 Java 谓词



是否有任何有效的变体来测试包含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());

一些注意事项:

  1. 在指定模拟功能时,我更喜欢doReturn(value).when(mock).method形式,但是很容易翻转到when(mock.method).thenReturn(value)形式。
  2. anyObject 在最新版本的 Mockito 中被弃用。它仍然存在,但它已被弃用。

编辑:我阅读了 2.23 版本的 Mockito 文档,它提到anyObject只是any方法的别名。

以下内容应该有效且不推荐使用:

doReturn(queryLauncherDtos).when(queryLauncherService).
  getLaunchersList(eq(user),
  ArgumentMatchers.<Predicate<QueryLauncher>>any());

相关内容

  • 没有找到相关文章

最新更新