6

设想:

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

细节:

Onclick 执行一个 AsyncTask,doInBackground 查询 REST API 并返回结果。onPostExecute 获取结果并将新的 ListAdapter 分配给带有数据的 ListView。

问题:

onPostExecute 不会被 Test Runner 调用,因为它位于同一个 UI 线程上并阻止调用。有几种模式可以处理这个问题。但是,如果我将 AsyncTask 放在 Runnable 中并使用 LatchCountdown 等待结果,则会收到 CalledFromWrongThread 异常。

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

4

2 回答 2

0

您想在Ui 线程上运行测试

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

  }
});
于 2012-11-16T14:56:35.083 回答
0

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

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

在 Activity 中进行测试:
1.) 通过继承它来创建包装类的串行版本,然后覆盖 exec 方法以按顺序执行:
- 通知侦听器任务已启动。
- 执行任务。
- 通知侦听器任务完成。

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

于 2012-11-16T19:30:45.063 回答