web-dev-qa-db-ja.com

ワイヤーモックツールを使用して接続タイムアウトをシミュレートすることは可能ですか?

SocketTimeoutExceptionを使用してwithFixedDelayをシミュレートできることは知っていますが、ConnectionTimeoutExceptionはどうですか?

14
Developer87

はい、WireMockでこれを行うには、Java APIに対してaddDelayBeforeProcessingRequests(300)を呼び出すか、以下をhttp://<Host>:<port>/__admin/socket-delayに投稿します。

{ "milliseconds": 300 }

(明らかに、300を遅延させたいミリ秒数に置き換えます)

9
Tom

チェックアウト https://github.com/tomakehurst/saboteur これにより、ネットワークの問題をシミュレートできます。または、iptablesを使用して自分で行うこともできます。

3

バージョン2.0.8-beta なので、この質問に対する答えは「いいえ」だったようです。

トム(WireMockの作者)が理由を説明します このGitHubの問題で

現時点では、純粋なJavaで接続タイムアウトを確実に強制することは基本的に不可能です。

以前は、ソケットで.accept()を呼び出す前に遅延を挿入できたのですが、実装の内部が変更されたため、しばらく前に機能しなくなったと思います。

現時点での私の推奨事項は、ネットワークスタックのレベルで機能するツールを使用することです。 iptables ... -j DROP typeコマンドでうまくいきます。または、これをある程度自動化したい場合は、 https://github.com/tomakehurst/saboteurhttps: //github.com/alexei-led/pumba

彼はまた、WireMockを停止するだけでは同じことは達成されないと説明しています。

wireMockをシャットダウンしても、同じ効果はありません。ポートがリッスンされていない場合、TCP RST(リセット)パケットが返されますが、接続タイムアウトが発生します最初のSYNパケットの後、タイムアウトウィンドウでサーバーから何も返されない場合。

0
DaveyDaveDave

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)
  )
);
0
Stef Heyenrath

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));
    }
0