2013-02-19 190 views
0

我遇到了一個有趣的情況,因爲java的File.listFiles()方法返回目錄中的文件列表,沒有任何保證的順序。一個類使用此listFiles()方法從目錄中的所有文件中讀取一些信息並寫入OutputStream。相應的JUnit測試用例會嘗試將寫入輸出流的數據與某個預期的byteArray進行比較。測試通過我的開發機器和生產堆棧,但在開發服務器上失敗,因爲它使用不同的操作系統和不同版本的Java。java File.listFiles()順序不能保證,並導致JUnit測試失敗

how to File.listFiles in alphabetical order?中,解決方案是強制對從File.listFiles()返回的數組進行排序。但是我對這個解決方案感到不舒服,因爲它正在做一些額外的工作,所以JUnit測試可以通過。

所以我只是想知道是否有更好的方法。有什麼建議?謝謝

+3

我認爲這是值得整理的。誰能保證prod服務器在1年後不會移動到雲端? – gaborsch 2013-02-19 21:03:18

+0

如果你說應用程序的業務邏輯不需要'排序文件',那麼你仍然必須有一些規則來決定你的OutputStream是否是一個正確的文件(它可能用在某個地方,並且預計會在某些地方具體格式還是smth)?如果這些規則存在,那麼你應該寫這些規則的單元測試 – jonasnas 2013-02-19 21:35:23

+0

感謝您的迴應。應用程序會彙總這些文件中的信息,每行代表一個獨立的信息單元。輸出的接收者在每一行上都起作用,所以我不認爲排序是必要的。但從所有的反應來看,它似乎排序輸出是最好的方式,我會把它放在適當的位置。 @GaborSch我不清楚你對雲的評論 - 它會對排序有什麼影響嗎? – Jim 2013-02-20 14:23:19

回答

3

我沒有看到總是排序列表的問題。你不僅要做單元測試:減少系統中的隨機性通常是一個好主意(它使測試更容易,並且當問題發生時,它使得它們更容易重現)。確實,你正在做額外的工作,但除非你正在讀取成千上萬的文件,否則排序不會成爲瓶頸(當然,定期配置文件)。

所以在我看來,排序是最好的選擇。

如果你不想/不能這樣做,另一個選擇是讓單元測試更智能;例如,不要一次比較整個byteArray,但檢查總大小並確保每個文件的結果都存在於數組中。或者在測試中解析和排序數組(儘管這可能很複雜)。

+0

太好了 - 似乎一致排序是要走的路,我肯定會這樣做。感謝大家! – Jim 2013-02-20 14:25:38