2009-10-20 72 views
3

我有一個小的JUnit測試導出一個對象到文件系統。首先我的測試看起來像這樣單元測試是否必須有一個聲明像「assertEquals(..)」

public void exportTest { 
    //...creating a list with some objects to export...  
    JAXBService service = new JAXBService(); 
    service.exportList(list, "output.xml"); 
} 

通常我的測試包含斷言喜歡的assertEquals(...)。所以我改變了代碼以下

public void exportCustomerListTest() throws Exception { 
    // delete the old resulting file, so we can test for a new one at the end 
    File file = new File("output.xml"); 
    file.delete(); 

    //...creating a list with some objects to export... 

    JAXBService service = new JAXBService(); 
    service.exportCustomers(list, "output.xml"); 

    // Test if a file has been created and if it contains some bytes 
    FileReader fis = new FileReader("output.xml"); 
    int firstByte = fis.read(); 

    assertTrue(firstByte != -1); 
} 

我需要這個,或者是第一種方法就夠了嗎?我在問,因爲第一個實際上只是「測試」代碼運行,而不是測試任何結果。還是我可以依靠「合同」,如果出口方法運行沒有例外的測試通過?

感謝

回答

4

嗯,你要測試你的代碼運行到完成無任何異常 - 但你不是測試有關的任何輸出。

爲什麼不保留文件與預期的輸出,並將其與實際輸出進行比較?請注意,如果您的expertCustomers的過載花費了Writer,那麼這可能會更容易 - 那麼您可以傳入StringWriter並只寫入內存。你可以通過幾種方式來測試,只需要一個測試超載的文件名就可以創建一個包含在OutputStreamWriter中的FileOutputStream,然後調用更徹底的測試方法。你可能真的需要檢查是否存在正確的文件。

1

,你可以,如果你發現問題的文件的生成過程中使用

assertTrue(new File("output.xml")).exist()); 

,你可以單元測試生成過程(而不是事實,文件被正確地寫入,並從文件系統重新加載)

你可以使用「黃金文件」的方法(測試兩個文件是1到1相同的)還是測試你的生成器的各種輸出(我想,生成的內容與保存到文件中是分開的)

1

我同意其他職位。我還會補充說,你的第一個測試不會告訴測試套件或測試運行者這個特定的測試失敗了。

0

有時候一個測試只需要證明沒有拋出異常。在這種情況下,依靠一個例外將會失敗,測試就足夠了。通過調用assertEquals方法,JUnit肯定沒有任何好處。測試通過時不會拋出AssertionException,而不是因爲調用該方法。考慮一個方法,使空的輸入,你可能會寫這樣一個測試:

@Test public void testNullAllowed() { 
     new CustomObject().methodThatAllowsNull(null); 
} 

這可能是足夠測試的右邊有(留下來單獨測試或也許沒有什麼有趣的測試有關它做什麼有一個空值),雖然謹慎地留下你沒有忘記斷言的評論,但你故意留下了它。

然而,在你的情況下,你還沒有太多的測試。當然它沒有炸燬,但是一個空的方法也不會炸燬。你的第二個測試更好,至少你演示了一個非空文件被創建。但是你可以做得比這更好,並檢查是否至少創造了一些合理的結果。

相關問題