在机器人电气测试中,如何在主循环程序中等待消息运行



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

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

但是在测试中使用Thread.sleep不起作用(我猜这是代码气味),onReceive无论如何都不调用。

在robolelectrical代码中逐步调试,我看到BroadcastReceiver被正确注册,广播被发送到主循环程序的调度程序,但随后什么也没有发生。

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

在robot - electric中,Service的调度程序通常处于暂停状态。任何放入队列的消息都不会运行,直到时间没有"提前"到一定数量。

给定一个服务myService,您可以访问它的机器人调度程序并运行它的排队消息:

org.robolectric.util.Scheduler scheduler = shadowOf(myService.get().getMainLooper()).getScheduler();
while (!scheduler.advanceToLastPostedRunnable()) ;
// ... put your test assertions here

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

最新更新