Mockito "when" 方法与 spring boot 2 中 RestTemplateBuilder requestFactory 上的 lambda 参数不匹配

Mockito "when" method does not match lambda argument on RestTemplateBuilder requestFactory in spring boot 2

我在尝试模拟 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 总是 returns null。 Mockito 还提示我设置中的第一行未被使用,并在 requestFactory 行中询问“args ok?”。

您的 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 的更多信息,请查看 the documentation