我想要做的就是像下面JUnit中:的Java:在JUnit的斷言使用記錄器*
assertTrue(logger.error("the condition is not true"), <a boolean condition>);
所以錯誤消息被通過記錄,其中記錄器可以記錄例如commons或log4j。
但Junit斷言不採取記錄器參數,所以有什麼辦法來實現這一點,或者我需要嘗試捕捉斷言並將錯誤消息記錄在catch塊?
我想要做的就是像下面JUnit中:的Java:在JUnit的斷言使用記錄器*
assertTrue(logger.error("the condition is not true"), <a boolean condition>);
所以錯誤消息被通過記錄,其中記錄器可以記錄例如commons或log4j。
但Junit斷言不採取記錄器參數,所以有什麼辦法來實現這一點,或者我需要嘗試捕捉斷言並將錯誤消息記錄在catch塊?
您可以使用一個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>
需要注意的是一個失敗的斷言是個例外,所以你必須訪問堆棧跟蹤等
我不會改變或擴展JUnit類。
安排您嘗試/捕獲和記錄錯誤將是可取的。
問題是,失敗的Assert不一定是一個例外。
感覺就像你正在努力使log4j進入已經存在的報告功能。我建議你看看Ant JUnit的報告任務 - 它會給你一個好看的報告,比日誌更有用。
更新:
您可以隨時添加另一個log4j文件appender。讓log4j將消息寫入控制檯和您選擇的文件。如果我是正確的,那麼你的代碼根本沒有變化。
好,我想要做的是控制輸出的JUnit的斷言如此我可以發送它到一些數據庫進行進一步分析。有沒有辦法使用Ant JUnit進行報告? – shrini1000
@duffymo失敗(junit)斷言*是一個異常,特別是一個AssertionError。這是JUnit的工作原理。 –
當我編寫JUnit時,我從來沒有發現錯誤。我要麼代碼爲斷言取得成功,或者在那些我期望出現異常的情況下,我添加註釋來說明。你可能是對的,JUnit正在以這種方式工作,但我不想對它進行編碼。 – duffymo
更好地利用這則
if(!<condition>) {
logger.error("my message");
Assert.fail();
}
正是我想要的。謝謝! – shrini1000
哪個版本的JUnit引入了這個? – duffymo
@duffymo TestWatcher是在4.9中引入的,它是作爲TestWatchman的替代品推出的,它本身在4.7中引入。 TestWatchman是一個稍微不同的東西,它使用了MethodRule,現在已經廢棄了。 –