it-swarm.com.ru

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

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

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

}

Есть ли способ избежать 2-го StubMapping от переопределения первого - чтобы убедиться, что первый раз doSomething() делает запрос, ответ с кодом состояния 500 и второй раз , другой ответ с кодом состояния 200 возвращается?

6
rugden

Вот для чего нужна сценария.

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

Смотрите: http://wiremock.org/docs/stateful-behaviour/

9
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>")));
1
rugden