2012-05-24 40 views
4

我想要做的就是像下面JUnit中:的Java:在JUnit的斷言使用記錄器*

assertTrue(logger.error("the condition is not true"), <a boolean condition>); 

所以錯誤消息被通過記錄,其中記錄器可以記錄例如commons或log4j。

但Junit斷言不採取記錄器參數,所以有什麼辦法來實現這一點,或者我需要嘗試捕捉斷言並將錯誤消息記錄在catch塊?

回答

19

您可以使用一個JUnit TestRuleTestWatcher。 A TestRule在測試方法之前和之後執行代碼(類似於@Before@After),但您可以訪問更多信息,更重要的是測試結果。 A TestWatcher定義了像succeeded()failed(),starting()finished()這樣的方法,您可以實現該方法以獲取事件通知。

以下示例僅使用失敗的斷言打印失敗的測試。

public class TestWatcherTest { 
    @Rule 
    public TestWatcher testWatcher = new TestWatcher() { 
    protected void failed(Throwable e, Description description) { 
     System.out.println("" + description.getDisplayName() + " failed " + e.getMessage()); 
     super.failed(e, description); 
    } 

    }; 

    @Test 
    public void test1() { 
    Assert.assertEquals("hello world", 3, 4); 
    } 
} 

你明顯可以做你喜歡的,而不是System.out.println()。這將產生作爲輸出:

test1(uk.co.farwell.junit.TestWatcherTest) failed hello world expected:<3> but was:<4> 

需要注意的是一個失敗的斷言是個例外,所以你必須訪問堆棧跟蹤等

+0

正是我想要的。謝謝! – shrini1000

+0

哪個版本的JUnit引入了這個? – duffymo

+2

@duffymo TestWatcher是在4.9中引入的,它是作爲TestWatchman的替代品推出的,它本身在4.7中引入。 TestWatchman是一個稍微不同的東西,它使用了MethodRule,現在已經廢棄了。 –

3

我不會改變或擴展JUnit類。

安排您嘗試/捕獲和記錄錯誤將是可取的。

問題是,失敗的Assert不一定是一個例外。

感覺就像你正在努力使log4j進入已經存在的報告功能。我建議你看看Ant JUnit的報告任務 - 它會給你一個好看的報告,比日誌更有用。

更新:

您可以隨時添加另一個log4j文件appender。讓log4j將消息寫入控制檯和您選擇的文件。如果我是正確的,那麼你的代碼根本沒有變化。

+0

好,我想要做的是控制輸出的JUnit的斷言如此我可以發送它到一些數據庫進行進一步分析。有沒有辦法使用Ant JUnit進行報告? – shrini1000

+0

@duffymo失敗(junit)斷言*是一個異常,特別是一個AssertionError。這是JUnit的工作原理。 –

+0

當我編寫JUnit時,我從來沒有發現錯誤。我要麼代碼爲斷言取得成功,或者在那些我期望出現異常的情況下,我添加註釋來說明。你可能是對的,JUnit正在以這種方式工作,但我不想對它進行編碼。 – duffymo

2

更好地利用這則

if(!<condition>) { 
logger.error("my message"); 
Assert.fail(); 
}