对可完成的未来的测试总是过去

poi*_*rez 4 java junit java-8 completable-future

我有以下测试应始终失败:

@Test
public void testCompletable() {
    CompletableFuture.completedFuture(0)
        .thenAccept(a -> {
            org.junit.Assert.assertTrue(1==0);
        });
}
Run Code Online (Sandbox Code Playgroud)

而这项测试总是成功的.如何才能使此测试失败?

Tun*_*aki 6

您永远不会尝试检索可完成的未来的结果.

completedFuture(0)将返回一个已完成且结果为0的可完成的thenAccept未来.添加的消费者将被调用并将返回一个新的可完成的未来.您可以通过在其中放入print语句来验证是否已调用它:

CompletableFuture.completedFuture(0)
.thenAccept(a -> {
    System.out.println("thenAccept");
    org.junit.Assert.assertTrue(1==0);
});
Run Code Online (Sandbox Code Playgroud)

这将"thenAccept"在控制台中打印.然而,这个新的可完成的未来异常完成,因为Assert.assertTrue抛出异常.这并不意味着向调用者抛出异常:它只是意味着我们现在处理一个特殊完成的可完成的未来.

所以当我们尝试检索调用者将有异常的值时.随着get(),ExecutionException将抛出join()一个CompletionException将被抛出.因此,以下

CompletableFuture.completedFuture(0)
.thenAccept(a -> {
    org.junit.Assert.assertTrue(1==0);
}).join();
Run Code Online (Sandbox Code Playgroud)

将失败.

  • @NicolasFilotto当然可以,但我们不知道这是什么情况.显然,这个测试并不是真正的OP,我认为这是一个MCVE - 如果他们这样做,整个测试无论如何都会毫无意义,因为它会测试JDK. (2认同)