慕碼人2483693
2023-04-13 16:46:00
我有以下代碼根據響應代碼重試請求。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
提交
取消