2

我正在通过扩展 ActivityInstrumentationTestCase2 编写一个 Android Activity 测试用例。我正在测试的活动将工作卸载到加载程序。Activity 本身就是 LoaderCallback。

问题是测试用例在加载器完成其工作之前完成(因为加载器显然在测试用例之外的另一个线程上运行)。我怎样才能让测试用例等到加载器完成它的工作。

我的一个想法是加入底层的 Loader 线程。但是,我似乎找不到访问底层线程的方法。此外,加载程序线程可能不会立即启动,因此不确定这是正确的方法。

另一种方法是在测试用例中注册一个 LoaderListener,但似乎一个特定的 Loader 只能有一个 LoaderListener。

4

3 回答 3

1

您可以设置最大超时。每隔一段时间检查加载程序中的空值,直到达到最大超时。一旦设置了最大超时,测试就会失败,因为加载程序不会加载。

于 2012-07-06T00:01:31.320 回答
0

尝试使用互斥锁或 ReentrantLock 来实现。

于 2013-03-20T16:20:15.920 回答
0

您需要在运行测试用例的线程与您等待完成的后台线程或操作之间使用一些 Java 同步方法。

我使用了倒计时锁存器。

在您的测试代码中(在我的情况下为活动)

创建活动时对其进行初始化

  • 私有最终 CountDownLatch 信号 = 新 CountDownLatch(1);

当 Loader 完成时,让您的代码表示它已完成:

  • 信号.countDown();

我在我的测试代码中为闩锁提供了一个吸气剂

  • public CountDownLatch getSignal() { 返回信号;}

在您的测试中:

  • 启动活动(启动后台线程)
    • MainActivity 活动 = getActivity();
  • 让闩锁等待
    • CountDownLatch 信号 = activity.getSignal();
  • 做其他事情,然后等待后台任务结束
    • if (!signal.await(30, TimeUnit.SECONDS)) { fail("等待后台任务完成超时"); }

这适用于在后台线程中完成的工作,AsyncTasks 等由您的活动的 onCreate() 方法启动...

于 2013-10-26T22:13:53.537 回答