2013-03-22 66 views
1

如何在JUnit4中看到assumeThat的錯誤消息?JUnit4:假設該消息未打印

此測試通過但不打印任何東西。原因是要執行read1的測試,我需要btrue。由於bfalse,因此測試不適用。

boolean b = false; 
byte[] read1 = null; 
assumeThat("b shold be true to continue testing", b, is(true)); 
assertThat("read1 should not be null", read1, is(notNullValue())); 

我還沒有在assumeThat消息中發現任何種類的日誌。我的問題在於,我想知道哪些測試通過但未完成,因爲假設X失敗。如果一條消息(例如類似於斷言失敗的消息)仍被打印用於假設,那將是很好的。

奇怪的是,我看不到這個問題(包括在JUnit頁面中)。所以有可能我只是做錯了事或者在錯誤的地方尋找消息。我正在使用Eclipe。

回答

0

如果我理解您正確的

assertThat("read1 should not be null", read1, is(notNullValue())); 

只應如果b == true它不是如果b == false錯誤執行,但?

那麼你爲什麼不乾脆做:

if(b) { 
    assertThat("read1 should not be null", read1, is(notNullValue())); 
} else { 
    log.warn("b == false, Test on read1 skipped"); 
} 

?或者,如果發生這種情況,你是否想要一個特殊的測試結果狀態(「成功但是可疑」)?

更新:我只是重讀了假設的文檔。它指出,如果一個假設失敗,整個測試被認爲「沒有意義」,並被標記爲「忽略」。通過小而專注的測試,通常應該爲您提供所需的所有信息。

Update2:剛剛在Eclipse 4.2中使用JUnit 4.8進行了試用,現在我已經在這裏了。這只是標誌着測試成功。所以我猜Eclipse中的JUnit runner可能不支持該功能。

+0

這就是我爲什麼要使用'assumeThat'。只有在特定條件成立時才進行測試,否則這樣做沒有意義。問題在於失敗的假設會導致成功的測試用例。但我無法知道測試用例是否因爲:* 1。假設失敗*或* 2。它通過了所有的斷言*。 – Daniel 2013-03-22 13:22:57

+0

@丹尼爾:是的,我只是試了一下,得到了同樣的結果。我現在知道了。並且沒有答案:( – creinig 2013-03-22 13:24:51

+0

我可以問一下'log.warn'是否是JUnit的擴展名?你能給我一個指向我可以在哪裏讀取它的信息嗎? – Daniel 2013-03-22 13:26:20

0

錯誤未打印,因爲假設失敗不是錯誤。 assume方法用於短路由於值或狀態而不應該運行的測試,因爲這些測試或狀態可能包含一個或多個對象(或基元)。假設是爲Theories跑步者設計的,但它們也可以用於其他跑步者。

假設的一個常見用法是當您有多個測試方法需要執行一些操作以在實際測試用例邏輯可以執行之前將對象置於特定狀態。

在假設之前,每個測試都會讓對象進入所需的狀態,聲明它處於該狀態,然後繼續。例如,對於一個堆棧測試,許多測試需要一個非空棧,所以你可以創建一個棧,推一個項目,聲明堆棧不是空的,然後做其餘的測試(彈出一個項目,推另一個項目等)。

如果您在多個測試中執行此模式,然後導致導致所有這些測試失敗的錯誤(例如,isEmpty()總是返回true),則會出現問題。當你運行測試時,你會遇到太多的失敗,你不知道從哪裏開始。

所以相反,你有一個測試,驗證如果你推入一個項目到一個空的堆棧,isEmpy()返回false。然後,需要一個非空棧任何測試做到這一點:

Stack<Object> stack = new Stack<>(); 
stack.push(new Object()); 
assumeFalse(stack.isEmpty()); 
// Continue with the test methods 

如果你想要一個錯誤信息,您可能想使用斷言。

0

同意以前的回答(由NamshubWriter)。
但是,如果你真的想(名正言順)有明確的跡象表明,測試被忽略,因爲一些假設失敗了,你可以這樣做:

@Before 
public void before() { 
    final String mandatoryPropKey = "system.mandatory-property-for-this-test"; 
    final String mandatoryPropExpectedVal = "true"; 
    try { // try/catch because the Assume failure won't print any message (by design) 
     Assume.assumeTrue("Assumed that the \"" + mandatoryPropKey + "\" system property is \"" + mandatoryPropExpectedVal + "\".", Boolean.valueOf(System.getProperty(mandatoryPropKey, mandatoryPropExpectedVal))); 
    } catch (AssumptionViolatedException ave) { 
     logger.warn("Not executing this test because this assumption failed: {}", ave.getMessage()); 
     throw ave; 
    } 
}