我知道,它可以使用SocketTimeoutException
来模拟withFixedDelay
,但ConnectionTimeoutException
呢?
答案 0 :(得分:8)
是的,可以通过针对Java API调用addDelayBeforeProcessingRequests(300)
或将以下内容发布到http://<host>:<port>/__admin/socket-delay
来使用WireMock执行此操作:
{ "milliseconds": 300 }
(很明显,你要用很多毫秒的时间来替换300,并且想要延迟)
答案 1 :(得分:4)
从version 2.0.8-beta开始,这个问题的答案似乎是“否”。
Tom(WireMock的作者)解释了为什么in this GitHub issue:
目前基本上不可能在纯Java中可靠地强制连接超时。
过去,您可以在套接字上调用
.accept()
之前插入一个延迟,但是由于实现内部的变化,我想那一会儿就停止工作了。目前,我的建议是使用在网络堆栈级别上可用的工具。
iptables ... -j DROP
类型的命令可以解决问题,或者,如果您希望对此有所自动化,则可以使用https://github.com/tomakehurst/saboteur或https://github.com/alexei-led/pumba之类的工具。
他还继续解释说,仅停止WireMock并不会实现相同的目的:
关闭WireMock不会产生相同的效果-当未监听端口时,您会收到一个TCP
RST
(重置)数据包,而当您没有从中获得任何回报时,就会发生连接超时初始SYN
数据包之后,在超时窗口中打开服务器。
答案 2 :(得分:3)
结帐https://github.com/tomakehurst/saboteur,可让您模拟网络问题。或者你可以用iptables自己做。
答案 3 :(得分:1)
使用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)
)
);
答案 4 :(得分:0)
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));
}