2015-07-29 1 views
0

Я тестирую сервис с использованием Robolectric 3. После запуска он регистрирует анонимный BroadcastReceive, ожидающий, что система отправит широковещательную передачу после некоторого события.В тесте Robolectric, как ждать сообщений в главном петлере для запуска?

В тесте я инициализирую службу, чтобы она регистрировала BroadcastReceiver, затем я запускаю системное событие, а затем проверяю, что состояние службы изменилось соответствующим образом после обработки широковещательной передачи. Но поскольку метод onReceive выполняется асинхронно, утверждения запускаются слишком быстро.

Но с использованием Thread.sleep в тесте не сработало (и, по-моему, это запах кода), onReceive не называется.

Выполнение пошаговой отладки в коде Robolectric. Я вижу, что BroadcastReceiver правильно зарегистрирован, и широковещательная передача отправляется в планировщик основного петлетера, но затем ничего не происходит.

Итак, как я могу заставить главный планировщик запускать ожидающие действия и позволить моему тесту ждать их завершения?

ответ

0

В Robolectric планировщик службы обычно находится в состоянии паузы. Любое сообщение, помещенное в очередь, не запускается до тех пор, пока время не будет «расширенным» на определенную сумму.

Учитывая служба myService, вы можете получить доступ к его Robolectric планировщик и запустить его в очередь сообщений:

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

// ... put your test assertions here 

Пожалуйста, обратите внимание, что ярлык Robolectric.flushForegroundThreadScheduler() только выполняет все сообщения, которые были в очереди в то время; если кто-либо из них помещает другие сообщения, они не будут выполнены.