2012-11-16 43 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

相关问题