2012-02-18 72 views
0

我有一個寫入具有給定名稱的文件的方法。我是否必須測試這種方法,如果是,我應該測試它?用Java寫入文件的方法的測試

public void record(Object o){ 
    try{ 

     FileWriter fileStream = new FileWriter("data.txt", true); 
     BufferedWriter out = new BufferedWriter(fileStream); 

     out.write(o.toString()); 
     out.newLine(); 
     out.close(); 

    } catch (Exception e){ 
     System.err.println("Error: " + e.getMessage()); 
    } 
} 
+0

在這種特殊情況下,我會建議使用[FileUtils](http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html),並避免低級別的單元測試 – yegor256 2012-03-03 05:33:28

回答

3

是否需要測試是否是您的項目負責人的問題。如果它決定你應該寫一些測試,那麼我會至少測試這些情況下

  • 快樂路徑(寫一個好對象,檢查文件內容後)
  • 用空參數(文件存在,會發生什麼?它是什麼?它會關閉嗎?)
  • 如果方法被多次調用會發生什麼?
  • 如果該文件已經存在,會發生什麼,但不可寫
+0

如果文件不存在,例如它將被捕獲,或者我需要測試try catch是否真的捕獲異常? – FranXh 2012-02-18 16:49:08

+0

您不必測試* language *是否正常工作 - 即,您可以假設'try'和'catch'正確工作。但是,例如,如果出現問題,您應該測試一下狀態。例如,如果'toString()'方法拋出一個異常,它會被捕獲,並且一條消息被打印到標準輸出中(順便說一下,這實際上是永遠不可能在真實代碼中正確的)。但是該文件仍然會被打開,因此對該方法的後續調用將失敗 - 無論如何,在Windows操作系統上 - 因此。這些是測試可以發現的事物。 – 2012-02-18 19:08:36

2

回答這個問題:「我應該測試這個?」總是「是」。現在,您可能無法或可能不知道如何或有時間,或者被允許或想要,但這並不會改變答案。

+0

非常好的一點:D。我想我不知道要測試什麼 – FranXh 2012-02-18 16:50:34

+0

其他答案有很好的建議。我只想補充一點,你應該在你想要運行的平臺上嘗試他們的建議。 – colbadhombre 2012-02-18 17:02:46

2

測試總是受歡迎的,但在這種情況下,徹底的代碼審查可能是有益的。這是很難寫一個測試,會發現:

  • out可能無法正確關閉,導致文件描述符泄漏,即當o.toString()拋出異常

  • 如果它拋出一個異常,堆棧跟蹤將丟失(不正確的異常處理)

  • 如果Object o不覆蓋toString()它應該如何處理?

+0

Yeap,這是對的。這就是爲什麼我真的很困惑在這裏測試 – FranXh 2012-02-18 17:01:36

+0

@ user1181847:好吧,這並不是那麼糟糕。例如,你可以測試這個方法如何報告I/O錯誤(它不......),你檢查文件內容(實際上是添加了新行),檢查文件名等。但是嚴格地說這不再是*單位* - 測試。 – 2012-02-18 17:05:01

1

一對夫婦更代碼審查建議:out.close()應在finally塊(有自己的try/catch),你可能要檢查的理智輸入參數,你可能要檢查是否已在文件存在並且可寫。另外,如果o是帶有自己換行符的String,會發生什麼情況?