以前寫了一篇介紹 HttpClient 的兩種重試機制, 可是否真的會按照預期進行重試咱們不得而知。java
別人提供給咱們的 API 每每都是正常的,不少錯誤並不能穩定重現,這也形成了咱們沒法進行全面的測試。正是這種狀況下,瞭解到了 WireMock。segmentfault
本文不打算作一個入門教程,重點在於如何用 WireMock 解決實際的問題。測試
首先初始化一個HttpClient
ui
public ZwroksApi(){ RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(1000).build(); DefaultServiceUnavailableRetryStrategy serviceUnavailableRetryStrategy = new DefaultServiceUnavailableRetryStrategy(); httpClient = HttpClients.custom() .setServiceUnavailableRetryStrategy(serviceUnavailableRetryStrategy) .setDefaultRequestConfig(requestConfig) .build(); }
進行了以下配置url
首先來模擬一下超時,設置了固定的 delay 2秒,因此必定會超時,按照預期會重試3次,因此一共是請求4次。.net
@Test public void testSocketTimeOut() { stubFor(get(urlEqualTo("/test")) .willReturn(aResponse() .withStatus(HttpStatus.SC_OK) .withHeader("Content-Type", "text/xml") .withBody("ok") .withFixedDelay(2000))); zwroksApi.test(); verify(4, getRequestedFor(urlEqualTo("/test"))); }
可是結果呢日誌
Expected exactly 4 requests matching the following pattern but received 1
具體的緣由在以前那篇文章也已經提過,SocketTimeoutException
是 InterruptedIOException
的子類,不會重試。code
如何超時也進行重試,在上一篇中也有講,這裏就不贅述了。xml
WireMock 中提供了幾種錯誤返回,使用也很簡單教程
@Test public void testBadResponse() { stubFor(get(urlEqualTo("/test")) .willReturn(aResponse().withFault(Fault.CONNECTION_RESET_BY_PEER))); zwroksApi.test(); verify(4, getRequestedFor(urlEqualTo("/test"))); }
這裏在運行時會拋錯 java.net.SocketException: Connection reset
,這種異常是會進行重試的,因此這裏測試能夠經過。
調用的代碼以下,我但願在返回503的時候進行重試
@Test public void testServiceUnavailable() { stubFor(get(urlEqualTo("/test")) .willReturn(aResponse() .withStatus(HttpStatus.SC_SERVICE_UNAVAILABLE) .withHeader("Content-Type", "text/xml") .withBody("service unavailable"))); zwroksApi.test(); verify(2, getRequestedFor(urlEqualTo("/test"))); }
這裏測試也是能夠經過的。WireMock 提供了獲取請求日誌的能力,除了次數,咱們能夠看看是否兩次請求是間隔了一秒。
List<ServeEvent> allServeEvents = getAllServeEvents(); long firstTime = allServeEvents.get(1).getRequest().getLoggedDate().getTime(); long lastTime = allServeEvents.get(0).getRequest().getLoggedDate().getTime(); assert lastTime - firstTime > 1000;
這裏只是介紹了一小部分 WireMock 的功能,更多的功能能夠去官網看文檔,很是好懂。