我正在使用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?
答案 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)
);