2014-05-06 67 views
0

我想在單元測試失敗時在問題跟蹤軟件中創建錯誤報告。這意味着當測試以字符串形式失敗時,我需要保存通常打印到IDE控制檯的內容。到目前爲止,我有以下代碼:如何將JUnit輸出分配給字符串?

@Rule 
public ErrorCollector collector = new ErrorCollector(); 
... 

@Test 
public void testFailedUnitTest() { 
    collector.checkThat(3, equalTo(5)); 
} 

它將以下內容輸出到控制檯。我想把這變成一個字符串,而不是/除了它輸出到我的IDE的控制檯:

java.lang.AssertionError: 
Expected: <5> 
    but: was <3> 
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20) 
    at org.junit.Assert.assertThat(Assert.java:865) 
    ... 

我曾嘗試:

  1. 與try/catch塊周圍和使用e。得到...但 它沒有捕獲java.lang.AssertionError。 catch塊中的代碼甚至沒有執行。我認爲這是因爲 我的收集器正在等待拋出異常後 testFailedUnitTest()完成拋出的錯誤,以便它可以 繼續執行失敗的測試。

  2. 圍繞一個正常的,非集合的JUnit測試與try/catch塊。

  3. 在我的tearDown()中抓取輸出後,所有測試都完成 。但沒有方法像public String [] getJUnitFailures()the ErrorCollector JavaDoc那麼 沒有工作。

  4. 在我的pom.xml中編輯某些東西的各種方法,如setting the redirectTestOutputToFile element to true,但它們與2)有相同的問題,不幸的是一些遺留代碼不使用Maven。但是,Maven特定的方法是可以接受的。

我與別人的人誰說我可能能夠使用the Logger class每個測試的輸出記錄到文件中,並作爲一個字符串讀取每個文件講話。他承認這是一種剽竊行爲,可能會干擾我們的其他日誌設施。

這是否會工作,如果是這樣,它是做到這一點的最佳方式?

預先感謝您。 :)

+0

另外我使用JUnit 4.11,但我可以很容易地改變我的pom.xml的版本,如果該解決方案是特定版本。 – JaneGoodall

+0

你的要求很奇怪。最好的選擇是將所有控制檯輸出重定向到日誌文件。你可以使用log4j,並且你應該能夠獲取從你的junit登錄的正確的日誌數據,因爲其他日誌也會在那裏。爲此,你應該在log4j.properties文件中用你可以搜索的字符串修改你的appender。 – vikeng21

+1

這可能不起作用。您在這裏重新創建輪子 - 我建議您使用現有的生成文檔的測試框架,或許是Sonar? –

回答

2

看起來像一個TestWatcher可以做你想做的。


import java.io.PrintWriter; 
import java.io.StringWriter; 

import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.TestRule; 
import org.junit.rules.TestWatcher; 
import org.junit.runner.Description; 

public class FailedTestCapturer { 

    @SuppressWarnings("null") 
    private static int throwNPE() { 
    String x = null; 
    return x.length(); 
    } 

    private String exception; 
    @Rule 
    public final TestRule watchman = new TestWatcher() { 
    @Override 
    protected void failed(Throwable e, Description description) { 
     StringWriter writer = new StringWriter(); 
     e.printStackTrace(new PrintWriter(writer)); 
     exception = writer.toString(); 
     System.out.println("Captured exception! --> " + exception); 
    } 
    }; 

    @Test 
    public void failingTest() { 
    throwNPE(); 
    } 
} 

輸出

Captured exception! --> java.lang.NullPointerException 
    at FailedTestCapturer.throwNPE(FailedTestCapturer.java:15) 
    at FailedTestCapturer.failingTest(FailedTestCapturer.java:32) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55) 
    at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
相關問題