我有以下代码根据响应代码重试请求。public class Sample { public static HttpClient getInstance() { HttpClientBuilder builder = HttpClients.custom(); builder.setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() { int waitPeriod = 200; @Override public boolean retryRequest(final HttpResponse response, final int executionCount, final HttpContext context) { int statusCode = response.getStatusLine().getStatusCode(); return ((statusCode == 429)&& (executionCount < 3)); } @Override public long getRetryInterval() { return waitPeriod; } }); return builder.build(); }}当我为此方法编写单元测试时,未涵盖getInstance覆盖的方法。(retryRequest, getRetryInterval)我如何编写单元测试来覆盖这些方法。通过谷歌搜索我发现我们可以使用ArgumentCaptor. 我试过下面的代码,但它不起作用。import static org.mockito.Mockito.when;import static org.mockito.Mockito.verify;import org.apache.http.HttpResponse;import org.apache.http.StatusLine;import org.apache.http.client.ServiceUnavailableRetryStrategy;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.impl.client.HttpClients;import org.apache.http.protocol.HttpContext;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.mockito.ArgumentCaptor;import org.mockito.Mock;}argumentCaptor.capture()总是给我null。我越来越喜欢org.mockito.exceptions.base.MockitoException:没有捕获到参数值!您可能忘记在 verify() 中使用 argument.capture()... ...或者您在存根中使用了 capture() 但未调用存根方法。谁可以帮我这个事。我想测试 retryRequest 方法的功能。
1 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
编辑:改写答案以使其更易于阅读。
应该由 PowerMockito 处理的类需要在
@PrepareForTest
注释中声明。如果注释用于创建模拟,则所有未在注释中声明的带注释的类
@PrepareForTest
都由 Mockito 创建。如果注释用于创建模拟并被
MockitoAnnotations.initMocks(this);
调用,这显然会导致声明被覆盖,所有模拟都由 Mockito 创建。(来源:https ://groups.google.com/forum/#!topic/powermock/yPBey4hr7IU )Mockito 无法处理静态或最终方法。
模拟操作可能会无提示地失败。
你的问题的根源是这HttpClientBuilder#setServiceUnavailableRetryStrategy
是一个最终的方法,因此不能被 Mockito 处理。
解决方案是 Mock ofHttpClientBulder
必须由 PowerMockito 处理。按照1.
它的需要在@PrepareForTest
注解中声明。
@PrepareForTest({ HttpClients.class, HttpClientBuilder.class, Sample.class})
如果你想使用注释来创建模拟,你不能调用
MockitoAnnotations.initMocks(this);
(见2.
/我用最新的 powermockito 版本(1.7.4 / 2.0.2)验证了这个问题)
否则你必须手动创建模拟。
HttpClientBuilder clientBuilderMock = PowerMockito.mock(HttpClientBuilder.class);
添加回答
举报
0/150
提交
取消