簡體   English   中英

是否可以使用wiremock工具模擬連接超時?

[英]Is it possible to simulate connection timeout using wiremock tools?

我知道它可以通過使用withFixedDelay來模擬SocketTimeoutException ,但是ConnectionTimeoutException呢?

是的,可以通過針對 Java API 調用addDelayBeforeProcessingRequests(300)或將以下內容發布到http://<host>:<port>/__admin/socket-delay來使用 WireMock 執行此操作:

{ "milliseconds": 300 }

(顯然,用您想要延遲的毫秒數替換 300)

2.0.8-beta 版本開始,這個問題的答案似乎是否定的。

Tom(WireMock 的作者)在這個 GitHub 問題中解釋了原因:

目前基本上不可能在純 Java 中可靠地強制連接超時。

過去的情況是,您可以在對套接字調用.accept()之前注入延遲,但一段時間后停止工作,我猜是由於實現內部的變化。

我目前的建議是使用在網絡堆棧級別工作的工具。 iptables ... -j DROP類型的命令可以解決這個問題,或者如果你想要一個自動化程度,你可以使用諸如https://github.com/tomakehurst/saboteurhttps://github.com/ 之類的工具阿列克謝領導的/彭巴

他還繼續解釋說,僅僅停止 WireMock 並不能達到同樣的目的:

關閉 WireMock 不會有同樣的效果——當一個端口沒有被監聽時,你會得到一個 TCP RST (重置)數據包,而當你在超時窗口中沒有從服務器得到任何返回時,連接超時發生初始SYN數據包。

查看https://github.com/tomakehurst/saboteur ,它允許您模擬網絡問題。 或者你可以用 iptables 自己做。

java.net.ConnectException本質上意味着我們無法與目標方建立網絡連接。 考慮到這一點,我剛剛停止了我的wiremock實例,它工作正常。

我的第三方api調用的實現捕獲此異常並重新拋出HTTP 500錯誤消息(這是我試圖斷言)

    @Before
    public void setUp() {
        wireMock.start();
    }

    @After
    public void clean() {
        wireMock.resetMappings();
    }

    @Test
    public void shouldSimulateConnectionTimeout() {
        //given - STOP THE WIREMOCK
        wireMock.stop();

        //when
        Response response = getTarget("external api URL")
                             .request()
                             .post(entity(event, APPLICATION_JSON_TYPE));

        //then
        assertEquals(500, response.getStatus());
        assertEquals("{\"message\" : \"java.net.ConnectException: Connection refused\"}", response.readEntity(String.class));
    }

使用WireMock.Net 時,也可以添加延遲。

例子:

var server = WireMockServer.Start();

// add a delay of 30 seconds for all requests
server.AddRequestProcessingDelay(TimeSpan.FromSeconds(30));

或者

var server = WireMockServer.Start();
server
  .Given(Request.Create().WithPath("/slow"))
  .RespondWith(
    Responses.Create()
      .WithStatusCode(200)
      .WithBody(@"{ ""msg"": ""Hello I'm a little bit slow!"" }")
      .WithDelay(TimeSpan.FromSeconds(10)
  )
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM