Почему нет тестера для BroadcastReceiver?
Может, я что-то упустил. Я хочу написать тестовые примеры для BroadcastReceiver; в частности, он принимает событие BOOT_COMPLETED и устанавливает тревогу для другого приемника для обработки позже; он, кажется, не устанавливает его должным образом, но дело в том, что у меня нет очевидного способа проверить его. Я не могу точно установить отладчик и ждать BOOT_COMPLETED, и я не могу отправить фальшивую широковещательную передачу BOOT_COMPLETED.
Почему существуют классы инструментов для Activity, Service и Provider, но не BroadcastReceiver? Любые советы для тестирования этого?
Ответы
Ответ 1
Нет ничего волшебного в жизненном цикле для BroadcastReceiver. Этого достаточно, чтобы протестировать его с помощью AndroidTestCase. В тестовом случае создайте экземпляр своего BroadcastReceiver, создайте любой Intent, который вы хотите отправить, и вызовите onReceive, используя Контекст, доступный из AndroidTestCase или какой-то макет Контекст.
например.
public class TestMyBroadcastReceiver extends AndroidTestCase {
public void testReceive() {
MyBroadcastReceiver r = new MyBroadcastReceiver();
Intent i = new Intent("MY_ACTION");
// TODO put extras
r.onReceive(getContext(), i);
// TODO query application state to verify results
}
}
Ответ 2
В большинстве случаев я полностью согласен с fooobar.com/info/468142/...
Однако существуют случаи, когда расширение AndroidTestCase
не подходит (и может вызвать сюрпризы). В частности, если вы выполняете более сложное интеграционное тестирование и хотите протестировать BroadcastReceiver
с фактическим Intent
, отправленным системой. Основная причина заключается в том, что метод onReceive
в широковещательном приемнике работает в основном потоке приложения, а тесты в AndroidTestCase
выполняются в другом потоке. Это может вызвать связанные с тестированием проблемы с потоками в коде, который не предназначен для работы на нескольких потоках.
Решением этого является подклассу вашего теста из InstrumentationTestCase
вместо этого и используйте аннотацию @UiThreadTest
, чтобы тесты выполнялись в том же потоке, что и метод onReceive
.
Для получения дополнительной информации (и примера) см. http://olafurhelgason.blogspot.com/2012/12/threading-and-android-integration.html