2010-09-15 75 views
17

我想在我正在開發的一個小項目上實現JUnit,因爲我想了解一點。如何比較JUnit測試用例中的文件?

我閱讀的教程都引用了具有特定輸出的方法。

在我的情況下,我的輸出是文件,我該怎麼做?任何簡單的例子? 任何可以幫助我的方法?

這些文件是通過void私有方法構建的原始文本文件。

+0

怎樣的方法寫入文件?如果他們得到一個流,你可以給他們自己的,而不是一個指向一個文件,然後比較它。 – 2010-09-15 08:08:49

+0

whith基本寫入緩衝區字符串在一個網絡爬蟲(我按回車但它寫了消息)代碼是這樣的:txtUrlSpecial.write(bigText.charAt(j)); – Saikios 2010-09-15 08:12:45

回答

16

你想獲得一個給定的輸入,並設置一個測試打電話給你空白法這些輸入正確的輸出文件,然後比較反對什麼你的方法產生已驗證的輸出文件。你需要確保你有一些方法來指定你的方法輸出到哪裏,否則你的測試會非常脆弱。

@Rule 
public TemporaryFolder folder = new TemporaryFolder(); 

@Test 
public void testXYZ() { 
    final File expected = new File("xyz.txt"); 
    final File output = folder.newFile("xyz.txt"); 
    TestClass.xyz(output); 
    Assert.assertEquals(FileUtils.readLines(expected), FileUtils.readLines(output)); 
} 

使用Commons-io的FileUtils的舒適文本文件比較& JUnit的TemporaryFolder,以確保輸出文件從未存在試運行之前。

+0

我喜歡這個,但爲什麼沒有人投票給你的答案? :S – Saikios 2010-09-15 08:24:20

+2

你可以隨時爲它投票 – 2010-09-15 09:27:09

+0

eclipse說org.junit.internal.runners.TestClass已被棄用=( – Saikios 2010-09-15 18:21:29

2

在您的方法寫入文件後,在單元測試中,您可以讀取該文件並驗證它是否正確寫入。

另一件有意義的事情是將您的方法拆分成一個檢索該數據並將其返回給僅將其寫入文件的方法的方法。然後你可以驗證第一個方法返回的數據是否正確。

而另一種合理的方法是將OutputStream傳遞給寫入數據的方法。在「實際代碼」中,您可以通過FileOutputStream/FileWriter,而在測試代碼中,您可以編寫OutputStream的模擬實現並檢查正在寫入的內容。

1

如果您無法控制將輸出放入流中的方法,那麼我會說您需要重構代碼,以便該方法在參數(或其類的構造函數)中接收流, 。

之後,測試很容易 - 您可以檢查流。易於測試的代碼通常等同於優秀的代碼。

+0

問題是,實際上它不會生成一個單獨的文件,它會根據不同的事情製作3到5個文件。但是因爲我真的很喜歡junit,所以我想先用一個單獨的文件嘗試一下,以便完全理解它。謝謝= D。 – Saikios 2010-09-15 08:20:55

+0

@Saikios這是任何數量的文件:) – 2010-09-15 08:55:52

1

雖然你的問題可能看起來過於簡單,但它確實觸發了單元測試的核心,需要編寫可測試的格式良好的代碼。這就是爲什麼有些專家建議先寫單元測試,然後再寫實施課。

在你的情況我建議你讓你的方法來執行,並創建預期文件(S),隨後你的單元測試(S)可以分析該文件正確形成。

+0

謝謝,下次我會記住首先進行我的單元測試:D – Saikios 2010-09-15 08:16:37

+0

編寫整個文件的代碼片段可能太大而且很複雜,JUnit可能會顯示代碼是否仍然有效(無迴歸),這是一件好事,但真的很好單元測試還有助於查找什麼是壞 – h22 2013-06-13 19:34:52