web-dev-qa-db-ja.com

Wiremock:同じURLとコンテンツに対する複数の応答?

ここでも共有: https://github.com/tomakehurst/wiremock/issues/625

REST APIが失敗した要求を適切に処理することを確認するために、統合テストを作成しています。これを行うには、GET要求が行われるシナリオをシミュレートしたいと思います。 HTTPエンドポイントに対して2回。1回目はリクエストが500のレスポンスステータスコードで成功せず、2回目はリクエストが200のレスポンスステータスコードで成功しています。以下の例を考えてみます。

_@Rule
public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicPort()
                                                               .dynamicHttpsPort());

@Test
public void testRetryScenario(){

// First StubMapping
stubFor(get(urlEqualTo("/my/resource"))
        .withHeader("Accept", equalTo("text/xml"))
        .willReturn(aResponse()
            .withStatus(500) // request unsuccessful with status code 500
            .withHeader("Content-Type", "text/xml")
            .withBody("<response>Some content</response>")));

// Second StubMapping
stubFor(get(urlEqualTo("/my/resource"))
        .withHeader("Accept", equalTo("text/xml"))
        .willReturn(aResponse()
            .withStatus(200)  // request successful with status code 200
            .withHeader("Content-Type", "text/xml")
            .withBody("<response>Some content</response>")));

//Method under test that makes calls to endpoint
doSomething();

Thread.sleep(5000);

//Verify GET request was made again after first attempt
verify(exactly(2), getRequestedFor(urlEqualTo("/my/resource")));

}
_

2番目のStubMappingが最初のStubMappingを上書きしないようにする方法はありますか?doSomething()が最初にリクエストを行うことを確認するために、aステータスコード500のレスポンスが返され、2回目はステータスコード200の別のレスポンスが返されますか?

8
rugden

これがシナリオ機能の目的です。

両方のスタブをシナリオ(つまり、同じシナリオ名)に入れ、最初のスタブが新しい​​状態への遷移をトリガーするようにし、次に2番目のスタブを2番目の状態にあるシナリオに依存させ、最初のスタブをオンにさせる必要があります。シナリオはSTARTED状態です。

参照: http://wiremock.org/docs/stateful-behaviour/

12
Tom

シナリオ機能を使用して、このようなものが助けになりました

// First StubMapping
stubFor(get(urlEqualTo("/my/resource"))
        .withHeader("Accept", equalTo("text/xml"))
        .inScenario("Retry Scenario")
        .whenScenarioStateIs(STARTED)
        .willReturn(aResponse()
            .withStatus(500) // request unsuccessful with status code 500
            .withHeader("Content-Type", "text/xml")
            .withBody("<response>Some content</response>"))
        .willSetStateTo("Cause Success")););

// Second StubMapping
stubFor(get(urlEqualTo("/my/resource"))
        .withHeader("Accept", equalTo("text/xml"))
        .inScenario("Retry Scenario")
        .whenScenarioStateIs("Cause Success")
        .willReturn(aResponse()
            .withStatus(200)  // request successful with status code 200
            .withHeader("Content-Type", "text/xml")
            .withBody("<response>Some content</response>")));
3
rugden