我有以下的測試,應該總是失敗:測試上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