Почему нет тестера для 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