首页 > 解决方案 > Mockito“何时”方法与 Spring Boot 2 中 RestTemplateBuilder requestFactory 上的 lambda 参数不匹配

问题描述

我在尝试模拟 restTemplateBuilder 时遇到问题:

private RestTemplate restTemplate() {

    HttpClient client = HttpClients.custom().build();


    return restTemplateBuilder.
           requestFactory(() -> new HttpComponentsClientHttpRequestFactory(client)).
           build();
}

我的测试方法设置如下:

    @Before
    public void setUp() {
        when(restTemplateBuilder.requestFactory(() -> any(ClientHttpRequestFactory.class))).thenReturn(restTemplateBuilder);
        when(restTemplateBuilder.build()).thenReturn(restTemplate);
    }

在这种情况下,requestFactory 总是返回 null。Mockito 还提示我 setup 中的第一行未使用,并在 requestFactory 上询问“args ok?”。

标签: javaspringspring-boot-2

解决方案


您需要在 when 子句中使用 lambda 函数的匹配器。您可以使用Mockito中的 argThat,例如:

when(restTemplateBuilder.requestFactory(argThat(()-> new HttpComponentsClientHttpRequestFactory(clientMock))).thenReturn(restTemplateBuilder);

以客户为模拟对象。


另一种方法是使用 ArgumentCaptor:

    @Captor
    private ArgumentCaptor<Supplier> lambdaCaptor;

并使用它:

when(restTemplateBuilder.requestFactory(lambdaCaptor.capture()).thenReturn(restTemplateBuilder);

如果您需要有关匹配 lambda 的更多信息,请查看文档


推荐阅读