2016-08-03 54 views
3

我有以下的测试,应该总是失败:测试上completable未来总是通过

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

而且这个测试总是成功。我怎样才能使这个测试失败?

回答

6

你从来没有尝试检索completable未来的结果。

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,用join(),将抛出CompletionException。因此,以下

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

将失败。

+0

你可以使用Assert.fail()而不是Assert.assertTrue(1 == 0)在这种情况下它听起来更有效,你不同意吗? –

+2

@NicolasFilotto当然,但我们不知道这是什么情况。显然,这个测试并不是真正的OP,我认为这是一个MCVE - 如果他们这样做了,那么整个测试都毫无意义,因为它会测试JDK。 – Tunaki

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(); 
}