我有以下的测试,应该总是失败:测试上completable未来总是通过
@Test
public void testCompletable() {
CompletableFuture.completedFuture(0)
.thenAccept(a -> {
org.junit.Assert.assertTrue(1==0);
});
}
而且这个测试总是成功。我怎样才能使这个测试失败?
我有以下的测试,应该总是失败:测试上completable未来总是通过
@Test
public void testCompletable() {
CompletableFuture.completedFuture(0)
.thenAccept(a -> {
org.junit.Assert.assertTrue(1==0);
});
}
而且这个测试总是成功。我怎样才能使这个测试失败?
你从来没有尝试检索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();
将失败。
这是可以做到这样的:
@Test
public void testCompletable() throws Exception {
CompletableFuture completableFuture = CompletableFuture.completedFuture(0)
.thenAccept(a -> Assert.fail());
// This will fail because of Assert.fail()
completableFuture.get();
}
你可以使用Assert.fail()而不是Assert.assertTrue(1 == 0)在这种情况下它听起来更有效,你不同意吗? –
@NicolasFilotto当然,但我们不知道这是什么情况。显然,这个测试并不是真正的OP,我认为这是一个MCVE - 如果他们这样做了,那么整个测试都毫无意义,因为它会测试JDK。 – Tunaki