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

2022-09-02 03:50:17

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

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

myMock = MockRestServiceServer.createServer(asyncRestTemplate);

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

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

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


答案 1

您可以通过以下方式实现此测试功能(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,因此您所做的任何请求网站设置都将在测试环境中丢失。


答案 2

如果您在 http 客户端中控制超时并使用例如 1 秒,则可以使用模拟服务器延迟

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

如果要在模拟服务器中删除连接,请使用模拟服务器错误操作

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

推荐