2016-08-03 52 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(); 
}