使用AsyncTask和UI更新解决方案进行Android单元测试

bcd*_*s72 6 android unit-testing ui-thread

场景:

我正在尝试对我的应用程序的onClick处理程序进行单元测试.Onclick对REST API进行简单搜索,返回结果并更新UI.

细节:

Onclick执行AsyncTask,doInBackground查询REST API并返回结果.onPostExecute获取结果并使用数据将新的ListAdapter分配给ListView.

问题:

测试运行器不会调用onPostExecute,因为它位于同一UI线程上并阻止调用.有几种模式可以解决这个问题.但是,如果我将AsyncTask放在Runnable中并使用LatchCountdown等待结果,我会得到CalledFromWrongThread异常.

是否有一个很好的解决方案来单元测试执行UI更新的AsyncTask?还是我可以实现的更可测试的设计?

bcd*_*s72 0

好吧,所以我想出的解决方案是这样的:

1.) 为前置和后置事件定义监听器接口。
2.) 在 Activity
2.) 上实现侦听器。 定义一个任务包装类,该类接受侦听器并且具有在“exec”上调用的内部 AsyncTask。
3.) 内部 AsyncTask 在 onPreExecute 和 onPostExecute 上通知侦听器
4.) 收到通知后,Activity 会更新其 UI。

对于活动中的测试:
1.) 通过继承来创建包装类的串行版本,然后重写 exec 方法以按顺序执行:
- 通知侦听器任务已启动。
- 执行任务。
- 通知监听者任务已完成。

用于测试任务的异步版本。
1.) 在单元测试方法中使用 CountdownLatch 和 Runnable。由于不需要任何 UI 更新,因此不会出现任何 WrongThreadExceptions。