java - 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?”。
解决方案
您需要在 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 的更多信息,请查看文档。
推荐阅读
- masstransit - 如何在 MassTransit 中分别配置请求超时和/或消息 TTL?
- ios - 模态对话框在基于 Mac 催化剂场景的应用程序中中断响应者链
- php - Laravel - 大集合和页面加载缓慢
- php - 如何在 wordpress 函数 php 中保存 cookie?
- r - 在 R 中使用 VAR 模型进行预测时如何使用未来/预测值
- r - 在 R 中更改日期格式
- pointers - Rust - 为什么我需要将对字符串的引用而不是字符串的引用传递给 std::io::read_line?
- python - Groupby Diff - 熊猫
- php - ubuntu 服务器 20.10 中的 PHP cURL
- powershell - 让 Powershell 将文件的大小报告为 CSV 并继续添加而不是替换数据