2011-05-17 84 views
4

我正在編寫一個Android應用程序,有時需要通過來自REST API的HTTP請求數據。我正在使用Apache DefaultHttpClient執行請求。有沒有辦法爲這個應用程序編寫測試,並在運行測試時「替換」DefaultHttpClient的響應,以便測試結果始終保持一致?在Android中僞裝HTTP請求響應以進行測試

作爲我想測試的一個例子,我正在訪問的一個Web服務接受一個字符串並執行文本搜索,返回一個分頁的對象列表。我需要測試列表爲空的情況,列表適合第一頁,或列表大於一個頁面,並且應用程序需要發出多個請求才能獲取完整列表。

我不是這個web API的開發者,也不能修改它的迴應,所以我不能改變它的回報。對於上面的例子,如果我想測試返回列表爲空的情況,我可以搜索一個字符串,我肯定不會返回任何結果,但另外兩種情況更難,因爲該服務可以回報總是在變化。

我認爲理想情況下,我將有一種方法在運行測試時獲取修改的DefaultHttpClient,該測試返回給定URL的請求的硬編碼結果,而不是實際執行網絡請求。這樣,我將始終獲得一致的結果,而不依賴於真實的Web服務響應。

我目前正在使用Robotium進行測試,但我也願意使用其他工具。

+0

請參閱https://github.com/fabiolnm/FakeWeb-Android-Project,這是一個符合dmon建議的實現。 – 2012-03-05 07:50:04

回答

2

是的,當使用HttpClient框架時,您肯定可以「僞造」響應。這是相當令人費解,而且我將要離開大多數細節給你,但我會給你一個快速概述:

  1. 實施ClientHttpRequestFactory,主要是讓你可以重寫createRequest()方法,所以你可以.. 。

  2. 返回的ClientHttpRequest您的自定義實現,在其中您可以覆蓋​​方法,以便你可以...

  3. 返回的ClientHttpResponse您的自定義實現中,你將最終能夠回到你的假響應數據,例如getBody()可以返回一個文件的內容,你可以硬編碼的報頭getHeaders()

其餘的是搞清楚如何最好地將所有這些把戲給你的服務層。

+0

謝謝,我會試試這個。 – izq 2011-05-17 02:36:50

+0

我想指出的是,我們也在使用Robotium進行測試,因此您正處於正確的軌道上。 – dmon 2011-05-17 02:39:55

2

你可能會給查爾斯嘗試這樣的事情。排序一個非代碼解決方案。

http://www.charlesproxy.com/

我用的是查爾斯的反向代理,併爲這樣的事情在地圖的本地工具。

你要做的是在反向代理端口上將你的請求指向你的本地盒子。 Charles可以將其配置爲提供靜態硬編碼平面文件,但對於您的應用程序,它看起來像100%真正的Web服務響應。

您可以使用Charles做很多其他很酷的事情 - 從您的android應用程序往返您的服務器和斷點(它允許您在發送和接收之前調整請求和響應)。絕對值得一試。

0

另一種選擇是使用依賴注入,以便在運行測試時更改HttpClient。如果您有興趣,請查看Guice

0

我猜你對使用標準Android Junit測試框架編寫功能測試感興趣。所以你可以在你自己的web服務器上實現你正在使用的API部分,並在運行你的測試時指向那個服務器。

如果你希望你的測試是獨立的,你可以實現一個運行在設備上的Http服務器。使用Android類庫中可用的Http服務器的示例是herehere