2012-04-19 56 views
3

我有一個關於單元測試的問題。我一直在想這個問題好幾天,卻找不到答案。如果使用模擬,在這種情況下進行單元測試的目的是什麼

說,我有一個功能,從Web服務下載文件並將其寫入磁盤。測試它的目的是什麼,沒有真正看到文件被下載並寫入磁盤?

雖然我明白我們可以嘲笑Web服務,但我怎麼能在這種情況下做到這一點?據我所知,像Mockito這樣的東西只會模擬行爲,但不會給出有意義的數據(在這個例子中是文件)。

即使我們可以嘲笑Web服務的行爲,我怎麼可以在沒有真正寫入磁盤的情況下將文件寫入磁盤?

對不起,我沒有具體的例子。請隨時發表您的意見。

非常感謝

回答

5

我總是說,單元測試代碼使它更加模塊化,因爲它迫使你想我怎麼可以斷開這個類,並在隔離測試。

在你的情況下,當你想測試像寫入文件到磁盤的東西,你可以改變你的方法寫文件來與簡單的OutputStream進行交互。這將確保你可以簡單地將ByteArrayOutputStream傳遞給函數,而不是實際FileOutputStream然後,您可以將字節轉換爲字符串,並檢查內容是否與您的實際期望相符。

也可以創建臨時文件並傳遞臨時文件的FileOutputStream進行寫入,隨後可以檢查文件的內容。

通過使該方法與OutputStream互動,你把它從確定的文件路徑的過程中分離,創建FileOutputStream

正如你提到的,它可能沒有多大意義,如果它來測試這個功能只是從某些Web服務獲取數據,並將其寫入文件。但是,如果智能操縱數據或者在Web服務交互引發異常時預計會做某些事情,那麼測試它會很有趣。

+0

啓發答案 – goh 2012-08-13 02:29:08

+0

+1好答案 - 臨時文件的使用絕對是好的,我想說的一件事就是確保你的測試後來刪除它們,以防止它們建立起來(在調查爲什麼CI服務器有一個完整的磁盤...) – robjohncox 2013-08-14 13:32:54

+0

@robjohncox你總是可以確保在正在創建的文件上調用'deleteOnExit'。 – 2013-08-21 12:11:57

4

說,我有一個功能,從Web服務下載文件並將其寫入磁盤。測試它的目的是什麼,沒有真正看到文件被下載並寫入磁盤?

沒有。你不用單元測試來測試。在這種情況下(與網絡,文件系統,數據庫的交互),您可以編寫integration tests。他們經常利用類似的工具和框架來進行單元測試,但他們有不同的目的 - 測試你的組件集成和它們之間的交互。集成測試通常模仿您的應用程序的實際使用情況。

如果您的所有功能都是調用一個服務/組件來下載文件,另一個服務/組件將其保存到磁盤,那麼在這種情況下單元測試是相當有限的。

相關問題