Wiremock: несколько ответов для одного и того же URL-адреса и содержимого?

Также опубликовано здесь: https://github.com/tomakehurst/wiremock/issues/625

Я пишу интеграционный тест, чтобы убедиться, что мое приложение, взаимодействующее с REST API, должным образом обрабатывает неудачные запросы. Для этого я хочу смоделировать сценарий, в котором запросы GET отправляются дважды к конечной точке HTTP. В первый раз запрос не выполняется с кодом состояния ответа 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?


person rugden    schedule 08.03.2017    source источник


Ответы (2)


Для этого и предназначена функция «Сценарии».

Вам нужно будет поместить обе заглушки в сценарий (то есть одно и то же имя сценария), сделать так, чтобы первая заглушка запускала переход в новое состояние, затем сделать вторую заглушку зависимой от сценария, находящегося во втором состоянии, а первой заглушки - в зависимости от сценарий находится в состоянии STARTED.

См .: http://wiremock.org/docs/stateful-behaviour/

person Tom    schedule 08.03.2017

Примерно так помогло использование функции сценариев

// 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>")));
person rugden    schedule 08.03.2017