MockRestServiceServer simulate backend timeout in integration test

前端 未结 5 1900
太阳男子
太阳男子 2021-02-12 20:02

I am writing some kind of integration test on my REST controller using MockRestServiceServer to mock backend behaviour. What I am trying to achieve now is to simulate very slow

相关标签:
5条回答
  • 2021-02-12 20:34

    In Restito, there is a buil-in function to simulate timeout:

    import static com.xebialabs.restito.semantics.Action.delay
    
    whenHttp(server).
       match(get("/something")).
       then(delay(201), stringContent("{}"))
    
    0 讨论(0)
  • 2021-02-12 20:36

    You can implement this test functionality this way (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);
        });
    

    But, I should warn you, that since MockRestServiceServer simply replaces RestTemplate requestFactory any requestFactory settings you'd make will be lost in test environment.

    0 讨论(0)
  • 2021-02-12 20:44

    If you control timeout in your http client and use for example 1 seconds you can use mock server delay

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

    If you want to drop connection in Mock Server use mock server error action

    new MockServerClient("localhost", 1080)
    .when(
        request()
            .withPath("/some/path")
    )
    .error(
        error()
            .withDropConnection(true)
    );
    
    0 讨论(0)
  • 2021-02-12 20:45

    Approach that you can go for: Specifying the responsebody either with Class Path resource or normal string content. More detailed version of what Skeeve suggested above

    .andRespond(request -> {
                try {
                    Thread.sleep(TimeUnit.SECONDS.toMillis(5)); // Delay
                } catch (InterruptedException ignored) {}
                return withStatus(OK).body(responseBody).contentType(MediaType.APPLICATION_JSON).createResponse(request);
            });
    
    0 讨论(0)
  • 2021-02-12 20:56

    In general, you can define your custom request handler, and do a nasty Thread.sleep() there.

    This would be possible in Restito with something like this.

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

    Not sure about Spring, however. You can easily try. Check DefaultResponseCreator for inspiration.

    0 讨论(0)
提交回复
热议问题