在Robolectric测试中,如何在main looper中等待消息为运行?
In Robolectric test, how to wait for messages in the main looper to be run?
我正在使用 Robolectric 3 测试服务。一旦 运行,它就会注册一个匿名 BroadcastReceive,等待系统在某些事件发生后发送广播。
在测试中,我初始化服务,以便它注册 BroadcastReceiver,然后触发系统事件,然后验证在处理广播后服务状态是否相应更改。但是因为 onReceive
方法是 运行 异步的,所以断言 运行 太早了。
但是在测试中使用 Thread.sleep
没有用(我猜这是代码味道),无论如何都不会调用 onReceive
。
对 Robolectric 代码进行逐步调试,我看到 BroadcastReceiver 已正确注册并且广播已发送到主循环程序的调度程序,但随后什么也没有发生。
那么我怎样才能让主调度程序 运行 成为未决操作并让我的测试等待它们完成?
在Robolectric中,Service的调度器通常处于暂停状态。任何放入队列的消息都不是 运行 直到时间不是 "advanced" 一定数量。
给定一个服务 myService
,您可以访问它的 Robolectric 调度程序和 运行 它的排队消息:
org.robolectric.util.Scheduler scheduler = shadowOf(myService.get().getMainLooper()).getScheduler();
while (!scheduler.advanceToLastPostedRunnable()) ;
// ... put your test assertions here
请注意,快捷方式 Robolectric.flushForegroundThreadScheduler()
仅 运行 发送当时队列中的所有邮件;如果其中任何一个放置了其他消息,它们将不会被执行。
我正在使用 Robolectric 3 测试服务。一旦 运行,它就会注册一个匿名 BroadcastReceive,等待系统在某些事件发生后发送广播。
在测试中,我初始化服务,以便它注册 BroadcastReceiver,然后触发系统事件,然后验证在处理广播后服务状态是否相应更改。但是因为 onReceive
方法是 运行 异步的,所以断言 运行 太早了。
但是在测试中使用 Thread.sleep
没有用(我猜这是代码味道),无论如何都不会调用 onReceive
。
对 Robolectric 代码进行逐步调试,我看到 BroadcastReceiver 已正确注册并且广播已发送到主循环程序的调度程序,但随后什么也没有发生。
那么我怎样才能让主调度程序 运行 成为未决操作并让我的测试等待它们完成?
在Robolectric中,Service的调度器通常处于暂停状态。任何放入队列的消息都不是 运行 直到时间不是 "advanced" 一定数量。
给定一个服务 myService
,您可以访问它的 Robolectric 调度程序和 运行 它的排队消息:
org.robolectric.util.Scheduler scheduler = shadowOf(myService.get().getMainLooper()).getScheduler();
while (!scheduler.advanceToLastPostedRunnable()) ;
// ... put your test assertions here
请注意,快捷方式 Robolectric.flushForegroundThreadScheduler()
仅 运行 发送当时队列中的所有邮件;如果其中任何一个放置了其他消息,它们将不会被执行。