是否可以使用wiremock工具模拟连接超时?

时间:2015-05-11 10:52:02

标签: java wiremock

我知道,它可以使用SocketTimeoutException来模拟withFixedDelay,但ConnectionTimeoutException呢?

5 个答案:

答案 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/saboteurhttps://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));
    }