我知道它可以SocketTimeoutException
通过使用来模拟withFixedDelay
,但是呢ConnectionTimeoutException
?
4 回答
是的,可以通过调用addDelayBeforeProcessingRequests(300)
Java API 或将以下内容发布到WireMock 来执行此操作http://<host>:<port>/__admin/socket-delay
:
{ "milliseconds": 300 }
(显然用你想延迟的毫秒数替换 300)
从2.0.8-beta 版本开始,这个问题的答案似乎一直是“否” 。
Tom(WireMock 的作者)在这个 GitHub 问题中解释了原因:
目前,在纯 Java 中可靠地强制连接超时基本上是不可能的。
过去的情况是,您可以在调用
.accept()
套接字之前注入延迟,但不久前就停止工作了,我猜是由于实现内部结构发生了变化。我目前的建议是使用在网络堆栈级别工作的工具。
iptables ... -j DROP
类型命令可以解决问题,或者如果您希望对此进行一定程度的自动化,您可以使用https://github.com/tomakehurst/saboteur或https://github.com/alexei-led/pumba等工具。
他还继续解释说,仅仅停止 WireMock 并不能达到同样的效果:
关闭 WireMock 不会有同样的效果 - 当一个端口没有被监听时,你会得到一个 TCP
RST
(重置)数据包,而当你在初始化之后的超时窗口中没有从服务器返回任何东西时,就会发生连接超时SYN
包。
结帐https://github.com/tomakehurst/saboteur它允许您模拟网络问题。或者你可以用 iptables 自己做。
使用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)
)
);