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

时间:2016-08-03 10:02:44

标签: java junit java-8 completable-future

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

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

此测试总是成功。如何才能使此测试失败?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

因此,当我们尝试检索调用者将具有异常的值时。使用get()时,会抛出ExecutionException CompletionExceptionCompletableFuture.completedFuture(0) .thenAccept(a -> { org.junit.Assert.assertTrue(1==0); }).join(); 会抛出gawk '{ sub(/^\s*(\S+\s+){4}/, "") }1' file 。因此,以下

import pip  
pip.main(['install', 'package-name'])

会失败。

答案 1 :(得分:2)

可以这样做:

@Test
public void testCompletable() throws Exception {
    CompletableFuture completableFuture = CompletableFuture.completedFuture(0)
        .thenAccept(a -> Assert.fail());
    // This will fail because of Assert.fail()
    completableFuture.get();
}