0

我正在尝试使用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;
    }
});
4

1 回答 1

0

为我的用例找到了解决方案,将其留在这里:

Awaitility.await()
          .atMost(Duration.ofSeconds(5))
          .untilAsserted(() -> 
               mockClient.verify(httpRequest, VerificationTimes.exactly(1))
           );
于 2022-02-02T10:15:34.653 回答