在Robolectric测试中,如何等待主循环中的消息运行?

时间:2015-07-29 09:13:24

标签: android robolectric

我正在使用Robolectric 3测试服务。一旦运行,它会注册一个匿名的BroadcastReceive,等待系统在发生某些事件后发送广播。

在测试中我初始化服务以便它注册BroadcastReceiver,然后我触发系统事件,然后我在处理广播后验证服务状态是否相应地改变了。但由于onReceive方法是异步运行的,因此断言运行得太快。

但是在测试中使用Thread.sleep不起作用(而且我猜的是代码味道),无论如何都不会调用onReceive

逐步调试Robolectric代码我看到BroadcastReceiver已正确注册,广播被发送到主循环器的调度程序,但没有任何反应。

那么如何让主调度程序运行挂起的操作并让我的测试等待它们完成?

1 个答案:

答案 0 :(得分:0)

在Robolectric中,服务的调度程序通常处于暂停状态。任何放入队列的消息都不会运行,直到时间没有“提前”一定量。

给定服务myService,您可以访问其Robolectric调度程序并运行其排队的消息:

org.robolectric.util.Scheduler scheduler = shadowOf(myService.get().getMainLooper()).getScheduler();
while (!scheduler.advanceToLastPostedRunnable()) ;

// ... put your test assertions here

请注意,快捷方式Robolectric.flushForegroundThreadScheduler()仅运行当时队列中的所有邮件;如果其中任何一个发出其他消息,它们将不会被执行。