web-dev-qa-db-fra.com

MockRestServiceServer simule le délai d’expiration du test d’intégration

J'écris une sorte de test d'intégration sur mon contrôleur REST en utilisant MockRestServiceServer pour simuler le comportement du serveur principal. Ce que j'essaie de faire maintenant, c'est de simuler une réponse très lente du backend, ce qui conduirait finalement à un dépassement de délai d'attente dans mon application. Il semble que cela puisse être implémenté avec WireMock, mais pour le moment je voudrais m'en tenir à MockRestServiceServer.

Je crée un serveur comme ceci:

myMock = MockRestServiceServer.createServer(asyncRestTemplate);

Et puis je me moque de mon comportement backend comme:

myMock.expect(requestTo("http://myfakeurl.blabla"))
            .andExpect(method(HttpMethod.GET))
            .andRespond(withSuccess(myJsonResponse, MediaType.APPLICATION_JSON));

Est-il possible d'ajouter un type de délai ou de délai d'attente ou un autre type de latence à la réponse (ou peut-être un serveur totalement fictif ou même mon asyncRestTemplate)? Ou devrais-je simplement passer à WireMock ou peut-être Restito?

11
dune76

Vous pouvez réaliser tester cette fonctionnalité de cette façon (Java 8):

myMock
    .expect(requestTo("http://myfakeurl.blabla"))
    .andExpect(method(HttpMethod.GET))
    .andRespond(request -> {
        try {
            Thread.sleep(TimeUnit.SECONDS.toMillis(1));
        } catch (InterruptedException ignored) {}
        return new MockClientHttpResponse(myJsonResponse, HttpStatus.OK);
    });

Mais, je dois vous avertir que, puisque MockRestServiceServer remplace simplement RestTemplate requestFactory, tous les paramètres requestFactory que vous définiriez seraient perdus dans l'environnement de test.

8
Skeeve

Approche que vous pouvez utiliser: Spécifier le responsebody avec une ressource de chemin de classe ou un contenu de chaîne normal. Version plus détaillée de ce que Skeeve a suggéré ci-dessus

.andRespond(request -> {
            try {
                Thread.sleep(TimeUnit.SECONDS.toMillis(5)); // Delay
            } catch (InterruptedException ignored) {}
            return withStatus(OK).body(responseBody).contentType(MediaType.APPLICATION_JSON).createResponse(request);
        });
1
Pratik Kotadia

Dans Restito , il existe une fonction d’intervention pour simuler le délai d’expiration:

import static com.xebialabs.restito.semantics.Action.delay

whenHttp(server).
   match(get("/something")).
   then(delay(201), stringContent("{}"))
1
Lewy

En général, vous pouvez définir votre gestionnaire de requêtes personnalisé et y faire une méchante Thread.sleep().

Cela serait possible dans Restito avec quelque chose comme ça.

Action waitSomeTime = Action.custom(input -> {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    return input;
});

whenHttp(server).match(get("/asd"))
        .then(waitSomeTime, ok(), stringContent("Hello World"))

Pas sûr du printemps, cependant. Vous pouvez facilement essayer. Vérifiez DefaultResponseCreator pour l'inspiration.

0
Sotomajor

Si vous contrôlez le délai d'attente dans votre client http et utilisez par exemple 1 seconde, vous pouvez utiliser mock server delay

new MockServerClient("localhost", 1080)
.when(
    request()
        .withPath("/some/path")
)
.respond(
    response()
        .withBody("some_response_body")
        .withDelay(TimeUnit.SECONDS, 10)
);

Si vous souhaitez interrompre la connexion dans Mock Server, utilisez mock server error action

new MockServerClient("localhost", 1080)
.when(
    request()
        .withPath("/some/path")
)
.error(
    error()
        .withDropConnection(true)
);
0
makson