ここでも共有: 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の別のレスポンスが返されますか?
これがシナリオ機能の目的です。
両方のスタブをシナリオ(つまり、同じシナリオ名)に入れ、最初のスタブが新しい状態への遷移をトリガーするようにし、次に2番目のスタブを2番目の状態にあるシナリオに依存させ、最初のスタブをオンにさせる必要があります。シナリオはSTARTED
状態です。
シナリオ機能を使用して、このようなものが助けになりました
// 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>")));