25

也在这里分享:https ://github.com/tomakehurst/wiremock/issues/625

我正在编写一个集成测试来验证与 REST API 交互的应用程序是否正确处理了不成功的请求。为此,我想模拟一个向 HTTP 端点发出两次 GET 请求的场景。第一次请求不成功,响应状态码为500;第二次,请求成功,响应状态码为 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")));

}

有没有办法避免第二个 StubMapping 覆盖第一个 - 以确保第一次doSomething()发出请求,返回状态码为 500 的响应,第二次返回状态码为 200 的不同响应

4

2 回答 2

30

这就是场景功能的用途。

您需要将两个存根放入一个场景(即相同的场景名称),使第一个存根触发到新状态的转换,然后使第二个存根取决于场景处于第二个状态,第一个存根取决于情景处于STARTED状态。

请参阅:http ://wiremock.org/docs/stateful-behaviour/

于 2017-03-08T13:25:12.073 回答
20

使用场景功能,这样的事情有所帮助:

// 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>")));
于 2017-03-08T16:28:41.273 回答