2010-05-21 61 views
1

我想單元測試一個做SAX解析並創建一個對象的類。 該類將一個字符串作爲表示Internet上文檔URL的參數,對其進行解析,然後根據內容創建一個對象。如何重構我的課程,以便我可以進行單元測試?

我不想讓單元測試實際訪問網絡,所以我想要解析一些測試xml文件。不過,我不知道如何從我的AndroidTestCases訪問它們。我不想將測試文件包含在實際應用程序中,我希望他們在測試項目中(這是一個單獨的項目,因爲我可以收集Android測試的標準 - 由於需要定製AndroidManifest .xml,一個)。

一種方法是將XML文件放入測試項目的資產目錄中,我可以使用getContext().getAssets().open(filename)將它們讀入測試用例中的InputStream,但是我的類需要一個URL字符串。我寧願不必爲此類提供InputStream而不是當前的URL字符串。我可以通過創建兩個方法來測試解析,一個接受一個字符串,一個接受Inputstream,然後測試第二個,但是我怎麼才能測試一個只接受一個字符串的方法呢?

我應該如何設計我的班級和/或測試來規避此問題?

回答

0

你會想要依賴注入。根據我讀,你有一個方法簽名像這樣:

string -> object // using lambda notation 

這聽起來像你有獲得URL的內容存在於您所呼叫的同一方法的代碼。你應該把它重構成一個單獨的對象。然後,您可以製作一個模擬對象來進行測試,而不是進行網絡訪問,而是使用任何必要的參數對您的磁盤執行文件操作。在您的測試環境中,您可以在您的測試設置中注入模擬對象來代替真實的網絡吸氣劑對象。

然後,該方法並不關心它具有什麼對象,只要它返回一些文本進行解析即是XHTML或XML。

+0

該方法和使我的類接受InputStream而不是字符串有什麼區別?這不僅僅是增加額外的間接水平? – JRL 2010-05-21 14:34:12

+0

是的。這種額外的抽象層次意味着您可以在不影響主要方法的情況下更改底層代碼。然後,您不必在正常情況下將InputStream傳遞到方法中,因爲這通常不是您需要完成的任務。 – Tejs 2010-05-21 14:45:33

相關問題