2012-11-16 44 views
6

場景:使用AsyncTask和用戶界面更新解決方案的Android單元測試

我想單元測試我的應用程序的onClick處理程序。 Onclick根據REST API進行簡單搜索,返回結果並更新UI。

詳情:

的onclick執行的的AsyncTask,在doInBackground查詢REST API並返回結果。 onPostExecute接受結果並使用數據爲ListView分配一個新的ListAdapter。

問題:

的onPostExecute沒有得到通過測試運行器調用,因爲它是在相同的UI線程並阻止呼叫。有幾種模式可以解決這個問題。但是,如果我將AsyncTask放入Runnable中並使用LatchCountdown等待結果,則會得到CalledFromWrongThreadException。

是否有一個很好的解決方案單元測試一個AsyncTask的UI更新?或者我可以實現的更可測試的設計?

+0

這聽起來更像是一個ActivityInstrumentationTestCase ... – dmon

+0

這是在ActivityInstrumentationTestCase2類中完成的。 – bcdennis72

+0

你的asynctask應該運行良好,然後...... – dmon

回答

0

好的運行測試,所以我想出瞭解決的辦法是這樣的:

1)定義偵聽器接口前置&後事件。
2.)在活動
上實現監聽器2.)定義一個任務包裝類,它接受一個監聽器,並擁有一個在'exec'上調用的內部AsyncTask。
3.)內部的AsyncTask通知onPreExecute和onPostExecute的監聽器。4)通知後,Activity會更新它的UI。

爲了測試在活動:
1)從它繼承,然後覆蓋在順序執行exec方法創建的包裝類的串行版本:
- 通知偵聽任務的開始。
- 執行任務。
- 通知監聽者任務已完成。

用於測試任務的異步版本。
1.)在單元測試方法中使用CountdownLatch和Runnable。由於不需要任何UI更新,因此您不會有任何WrongThreadException。

+0

你可能在類似的討論[這裏]有趣(http://stackoverflow.com/questions/10491526/how-can-i-test-the - 結束一個按鈕,點擊,這種變化,活動,視圖,asy/10491965#10491965)和[這裏](http://stackoverflow.com/questions/8295003/best-way-to-管理最progressdialog從 - 的AsyncTask/8317071#8317071)。 – yorkw

相關問題