在Java 8中测试异步的fire-and-forget方法

时间:2017-06-24 18:39:53

标签: java integration-testing completable-future

我正在尝试编写一个集成测试,该测试涉及一种方法,该方法在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仅用于测试目的,但不是在我们想要发射并忘记的实际应用程序中?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用许多选项和库来等待&#34;对于结果或更好的说法,在断言异步结果之前,避免平均线程完成测试方法: