【问题标题】:Android Unit Testing with AsyncTask and UI Updates Solution使用 AsyncTask 和 UI 更新解决方案的 Android 单元测试
【发布时间】:2012-11-17 03:30:45
【问题描述】:

场景:

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

详情:

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

问题:

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

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

【问题讨论】:

  • 对我来说这听起来更像是一个 ActivityInstrumentationTestCase...
  • 这是在 ActivityInstrumentationTestCase2 类中完成的。
  • 您的 asynctask 应该可以正常运行...
  • @dmon 在进行 UI 更新时出错,出现 CalledFromWrongThread 异常。
  • 哦,我知道它在哪里出错了。嗯,有些东西很可疑……但如果它适合你……

标签: android unit-testing ui-thread


【解决方案1】:

您想在 Ui Thread 上运行测试

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

  }
});

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 您可能对herehere 的类似讨论感兴趣。
    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多