2015-11-03 42 views
0

我有一個JUnit測試類,它使用Mockito,我需要測試是否有記錄正確。基本上,它看起來像:單元測試日誌使用流只爲第一次測試工作

public class MyTest { 

    private final PrintStream outDefault = System.out; 
    private final PrintStream errDefault = System.err; 

    private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); 
    private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); 

    @Before 
    public void setUp() { 
     System.setOut(new PrintStream(outContent)); 
     System.setErr(new PrintStream(errContent)); 
    } 

    @After 
    public void tearDown() { 
     System.setOut(outDefault); 
     System.setErr(errDefault); 
    } 

    @Test 
    public void Test1_Condition_Expected() { 
     assertTrue(errContent.toString().toLowerCase().contains("...")); 
    } 

    ... 

    @Test 
    public void TestN_Condition_Expected() { 
     assertTrue(errContent.toString().toLowerCase().contains("...")); 
    } 
} 

我也試圖做了沖洗,並關閉在@After流的,但它似乎並沒有工作也不:

@After 
public void tearDown() { 
    try { 
     outContent.flush(); 
     errContent.flush(); 
     outContent.close(); 
     errContent.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.setOut(outDefault); 
    System.setErr(errDefault); 
} 

當我運行整個班級,第一次考試都通過了,但其餘的都沒有通過。如果我逐個運行測試,那麼所有測試都會通過。

我已經調試了代碼,一切似乎都正常工作,但對於除第一個之外的測試,流沒有獲取日誌,所以顯然它們失敗。

+1

您是否在每次測試後都嘗試過沖洗? – Mena

+0

是的,我試過了。反正它不工作... – Danziger

+0

哪個版本的JUnit? –

回答

1

注意,ByteArrayOutputStreams你沖洗:

outContent.flush(); 
errContent.flush(); 

......是不是你設置PrintStreams:

System.setOut(new PrintStream(outContent)); 
System.setErr(new PrintStream(errContent)); 

...這PrintStream的owns a BufferedWritercan be set to auto-flush, but doesn't do so by default

可選地,可以創建PrintStream以便自動刷新盟友;這意味着在寫入一個字節數組後,將自動調用flush方法,調用其中一個println方法或寫入換行符或字節('\n')。

我的猜測是這是PrintStream需要在每個斷言之前刷新對toString(),而不是ByteArrayOutputStream。

1

當您打電話給errorContent.toString()時,PrintStream不會被刷新,因爲@After在測試之後被調用,並且僅刷新errorContent。在撥打toString()之前,您必須沖洗errorContent左右的PrintStream。最好的方法是使用PrintStream with autoFlush enabled

@Before 
public void setUp() { 
    System.setOut(new PrintStream(outContent, true)); 
    System.setErr(new PrintStream(errContent, true)); 
}