亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 junit mockito 覆蓋匿名類重寫方法

如何使用 junit mockito 覆蓋匿名類重寫方法

慕碼人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個贊

編輯:改寫答案以使其更易于閱讀。


  1. 應該由 PowerMockito 處理的類需要在@PrepareForTest注釋中聲明。

  2. 如果注釋用于創建模擬,則所有未在注釋中聲明的帶注釋的類@PrepareForTest都由 Mockito 創建。

  3. 如果注釋用于創建模擬并被MockitoAnnotations.initMocks(this);調用,這顯然會導致聲明被覆蓋,所有模擬都由 Mockito 創建。(來源:https ://groups.google.com/forum/#!topic/powermock/yPBey4hr7IU )

  4. 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);


查看完整回答
反對 回復 2023-04-13
  • 1 回答
  • 0 關注
  • 355 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號