[英]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/saboteur或https://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.