我正在尝试编写一个集成测试,该测试涉及一种方法,该方法在Java 8中包含了“即发即弃”的完成阶段方法。应用程序代码如下所示:
public CompletionStage<User> createAndStoreUser() {
return createUser()
.thenApply(this::store)
.thenApply(user -> {
findTeam(user)
.thenAccept(team -> { // fire and forget
thirdPartyClient.enqueue(team);
})
.handle(swallow(t -> log.error("Enqueue team failed", t)));
return user;
})
})
目前,我的集成测试如下所示:
@Test
public void testCreateAndStoreUser() {
User user = createAndStoreUser().toCompletableFuture().join();
ItThirdPartyClient thirdPartyClient = itThirdPartyClient();
assertThat(thirdPartyClient.getQueue(), hasSize(1));
}
但是这并不能保证每次都通过,因为入队调用在不同的线程中,并且在断言完成时可能还没有完成。是否有任何方法可以强制嵌套的CompletionStage仅用于测试目的,但不是在我们想要发射并忘记的实际应用程序中?
感谢。
答案 0 :(得分:0)
您可以使用许多选项和库来等待&#34;对于结果或更好的说法,在断言异步结果之前,避免平均线程完成测试方法: