阻止,直到Loader在ActivityInstrumentationTestCase2中完成

时间:2012-05-11 15:18:49

标签: android android-testing

我正在通过扩展ActivityInstrumentationTestCase2来编写Android Activity测试用例。我正在测试的Activity将卸载工作转移到Loader。 Activity本身就是LoaderCallback。

问题是测试用例在Loader完成其工作之前完成(因为Loader显然在另一个线程上运行而不是测试用例)。如何让测试用例等到Loader完成其工作。

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

另一个虽然我在测试用例中注册了LoaderListener,但似乎特定的Loader只能有一个LoaderListener。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

尝试使用互斥锁或ReentrantLock。

答案 2 :(得分:0)

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

我使用了倒计时锁存器。

在您测试的代码中(我的情况下是Activity)

创建活动时将其初始化

  • private final CountDownLatch signal = new CountDownLatch(1);

装载程序完成后,让代码发出信号:

  • signal.countDown();

我在我的测试代码中为锁存器提供了一个getter

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

在你的测试中:

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

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