MockRestServiceServer模拟集成测试中的后端超时

时间:2016-05-06 15:26:15

标签: java spring mocking mockito mockmvc

我正在使用MockRestServiceServer在我的REST控制器上编写某种集成测试来模拟后端行为。 我现在想要实现的是模拟来自后端的非常慢的响应,这最终会导致我的应用程序超时。它似乎可以用WireMock实现,但目前我想坚持使用MockRestServiceServer。

我正在创建这样的服务器:

myMock = MockRestServiceServer.createServer(asyncRestTemplate);

然后我嘲笑我的后端行为,如:

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

是否有可能在响应中添加某种延迟或超时或其他类型的延迟(或者可能是整个模拟服务器甚至是我的asyncRestTemplate)?或者我应该切换到WireMock还是Restito?

5 个答案:

答案 0 :(得分:8)

您可以通过这种方式实现此功能的测试(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);
    });

但是,我应该警告你,因为MockRestServiceServer只是替换了RestTemplate requestFactory,你所做的任何requestFactory设置都会在测试环境中丢失。

答案 1 :(得分:1)

你可以去的方法: 使用类路径资源或普通字符串内容指定响应主体。 Skeeve上面提到的更详细的版本

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

答案 2 :(得分:1)

Restito中,有一个用于模拟超时的内置函数:

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

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

答案 3 :(得分:0)

通常,您可以定义自定义请求处理程序,并在那里执行令人讨厌的Thread.sleep()

这可以在Restito中使用这样的东西。

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

然而,不确定Spring。你可以轻松尝试。检查DefaultResponseCreator获取灵感。

答案 4 :(得分:0)

如果您在http客户端中控制超时并使用例如1秒钟,则可以使用mock server delay

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

如果要在Mock Server中断开连接,请使用mock server error action

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