使用AsyncTask和UI更新解决Android单元测试问题

6

场景:

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

细节:

OnClick执行AsyncTask,doInBackground查询REST API并返回结果。onPostExecute将结果取出并使用数据为ListView分配新的ListAdapter。

问题:

由于在同一个UI线程上且阻止调用,因此Test Runner不会调用onPostExecute。有几种模式可用于处理此问题。但是,如果我将AsyncTask放入Runnable中并使用LatchCountdown等待结果,则会出现CalledFromWrongThread异常。

是否有好的解决方案可以对执行UI更新的AsyncTask进行单元测试?或者有什么更具可测试性的设计可以实现?


这对我来说更像是一个ActivityInstrumentationTestCase... - dmon
这是在ActivityInstrumentationTestCase2类中完成的。 - bcdennis72
你的异步任务应该能够正常运行... - dmon
@dmon 当进行UI更新时,它会出现CalledFromWrongThread异常。 - bcdennis72
哦,我看到它出错了。嗯,有点可疑...但如果它对你有效的话... - dmon
2个回答

0

你想在Ui线程上运行测试

runOnUiThread(new Runnable() {
   public void run() {
      onPostExecute(...)

  }
});

0

好的,我想到的解决方案是:

1.) 为 pre 和 post 事件定义一个监听器接口。
2.) 在 Activity 上实现监听器。
3.) 定义一个任务包装类,接受一个监听器,并拥有一个被 'exec' 调用的内部 AsyncTask。
4.) 内部 AsyncTask 在 onPreExecute 和 onPostExecute 时通知监听器。
5.) 在收到通知后,Activity 更新其 UI。

在 Activity 中进行测试:
1.) 通过继承任务包装类创建序列化版本,然后重写 exec 方法以按顺序执行:
- 通知监听器任务已开始。
- 执行任务。
- 通知监听器任务已完成。

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


您可能会对类似的讨论感兴趣,请查看这里这里 - yorkw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接