2015-10-19 67 views
0

我使用RunListener來讓測試在寫入System.out時失敗,但是當我失敗()unittest時,偵聽器被移除。有沒有辦法讓測試失敗而不刪除監聽器?JUnit RunListener在失敗時被移除()

爲了便於識別代碼示例

public class OutputListenerTest { 
    @Test 
    public void testPrintIsDicovered() { 
    JUnitCore runner = new JUnitCore(); 
    // the OutputListener calls fail() when something was written 
    runner.addListener(new OutputListener()); 
    Result result = runner.run(TestWithOutput.class); 
    } 

    public static class TestWithOutput { 
    @Test 
    public void testOutput1() { 
     System.out.println("foo"); 
    } 

    @Test 
    public void testOutput2() { 
     System.out.println("bar"); 
    } 
    } 
} 

我期待什麼:2失敗的測試
的是:第一次測試失敗,並刪除偵聽器。

根據要求,這裏是OutputListener代碼http://paste.robbi5.com/4916ca5b 可以不粘貼它在這裏,它很長,並不會幫助解決這個問題嗎?

多一點背景
我選擇了RunListener,因爲它的工作原理與Maven很容易,只需添加

<properties> 
    <property> 
     <name>listener</name> 
     <value>OutputListener</value> 
    </property> 
    </properties> 

到Maven的萬無一失,插件和mvn test顯示了測試使用的System.out某種程度上來說。

+1

就我個人而言,我可能會簡單地添加一個自定義TestRule ...應該工作,以包裹實際檢驗器檢查輸出。 –

+0

我創建了這個例子,我的偵聽器沒有被刪除,所以我會查看你的偵聽器代碼。你能供應嗎? –

+0

Apidoc說:「如果一個偵聽器在處理測試事件時拋出一個異常,它將在測試運行的其餘部分被刪除。」當調試並逐步完成測試時,removeListener被調用。所以我非常確定Listener被刪除:) – globalworming

回答

1

添加一個Runner以添加偵聽器。

public class AddListenerRunner extends BlockJUnit4ClassRunner { 

    public AddListenerRunner(Class<?> klass) throws InitializationError { 
     super(klass); 
    } 

    @Override public void run(RunNotifier notifier){ 
     notifier.addListener(new OutputListener()); 
     super.run(notifier); 
    } 
} 

然後你可以在你的測試中使用它。

@RunWith(AddListenerRunner.class) 
public class OutputListenerTest { 
    @Test 
    public void testOutput1() { 
     System.out.println("foo"); 
    } 

    @Test 
    public void testOutput2() { 
     System.out.println("bar"); 
    } 
} 
+1

恩..不會那麼結果在很多相同的聽衆中,當測試沒有失敗時?此外,我更喜歡一個解決方案,我不必更改每一個我所擁有的測試課程。你的方法基本上是正確的,重寫運行方法是可行的。 – globalworming

+0

「默認選擇加入」對於這個問題來說是更可取的解決方案。如果需要爲幾乎所有測試用例添加註釋,則明確選擇退出默認選擇加入是更好的方法。 – user3001