【问题标题】:Mockito "when" method does not match lambda argument on RestTemplateBuilder requestFactory in spring boot 2Mockito“何时”方法与 Spring Boot 2 中 RestTemplateBuilder requestFactory 上的 lambda 参数不匹配
【发布时间】:2020-07-03 10:27:43
【问题描述】:

我在尝试模拟 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?”。

【问题讨论】:

  • 不应该是HttpComponentsClientHttpRequestFactory 而不是any中的ClientHttpRequestFactory 吗?
  • 这里没有区别。

标签: java spring spring-boot-2


【解决方案1】:

您的 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

【讨论】:

  • 所以第一个选项对我不起作用,出现“无法解析方法'requestFactory(T)'”的错误。第二个使用 @Captor private ArgumentCaptor lambdaCaptor;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2021-03-13
  • 2017-03-04
相关资源
最近更新 更多