我正在尝试使用MockServer ( https://www.mock-server.com ) 编写集成测试,并且我想验证anAsyncMethodThatReturnsImmediatly()
在测试类上运行异步方法后是否在模拟上调用了请求sut
。我的问题是测试在呼叫发生之前终止。
我有以下代码:
@Test
void test() {
HttpRequest httpRequest = HttpRequest.request()
.withMethod(HttpMethod.POST.name())
.withPath(MY_ENDPOINT);
HttpResponse httpResponse = HttpResponse.response().withStatusCode(200);
mockClient.when(httpRequest).respond(httpResponse);
sut.anAsyncMethodThatReturnsImmediatly();
long then = System.currentTimeMillis() + 1_000L;
Awaitility.await().until(() -> System.currentTimeMillis() > then);
mockClient.verify(httpRequest, VerificationTimes.exactly(1));
}
这行得通,但是如果我删除等待部分,那么它会失败,因为它sut.anAsyncMethodThatReturnsImmediatly()
是异步的并立即返回,我们最终会在调用发生之前调用验证。
我没有任何条件等待,因为那个调用是触发并忘记,我们不等待响应。
在代码中间等待的 1 对我来说显然是错误的。
有没有办法用 MockServer 测试这个?像验证电话在 x 秒内发生?
编辑:我以这种方式改进了普通的等待。那也行。尽管如此,仍然对更好的解决方案持开放态度。
Awaitility.await().atMost(Duration.ofSeconds(5)).until(() -> {
try {
mockClient.verify(httpRequest, VerificationTimes.exactly(1));
return true;
} catch (AssertionError ex) {
return false;
}
});