web-dev-qa-db-fra.com

Wiremock: Réponses multiples pour la même URL et le même contenu?

Également partagé ici: https://github.com/tomakehurst/wiremock/issues/625

J'écris un test d'intégration pour vérifier que mon application qui interagit avec une API REST gère correctement les demandes infructueuses. Pour ce faire, je souhaite simuler un scénario dans lequel une requête GET est effectuée deux fois sur un point de terminaison HTTP. Pour la première fois, la requête n'aboutit pas avec un code d'état de réponse de 500; deuxième fois, la demande aboutit avec un code d’état de réponse de 200. Prenez l’exemple ci-dessous:

@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")));

}

Existe-t-il un moyen d’empêcher le 2nd StubMapping de remplacer le premier - pour s’assurer que la première fois que doSomething() fait une demande,une réponse avec le code d’état 500est renvoyée, et le deuxième fois,une réponse différente avec le code d'état 200est renvoyé?

6
rugden

C’est ce à quoi sert la fonctionnalité Scénarios.

Vous devez placer les deux stubs dans un scénario (c'est-à-dire le même nom de scénario), faire en sorte que le premier stub déclenche une transition vers un nouvel état, puis associer le second stub au scénario et au premier état. le scénario étant dans l'état STARTED.

Voir: http://wiremock.org/docs/stateful-behaviour/

9
Tom

Quelque chose comme cela a aidé, en utilisant la fonctionnalité de scénarios

// 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