Я начинаю писать тесты для своего приложения для Android. Он работает нормально для большинства приложений, но у меня есть BroadcastReceiver для обработки входящих смс, этот приемник в свою очередь вызывает abortBroadcast()
в некоторых случаях. Этот маленький вызов вызывает тестовый случай, чтобы потерпеть неудачу с исключением следующего:Android JUnit test BroadcastReceiver не работает на abortBroadcast()
java.lang.IllegalStateException: Call while result is not pending
at android.content.BroadcastReceiver.checkSynchronousHint(BroadcastReceiver.java:772)
at android.content.BroadcastReceiver.abortBroadcast(BroadcastReceiver.java:689)
Мой тест выглядит следующим образом сейчас:
public void testOnReceive() {
Optional<byte[]> mockSmsWrapper = TestUtils.createMockSms(getContext(), sender, body);
if (mockSmsWrapper.isPresent()) {
SmsReceiver receiver = new SmsReceiver();
Intent intent = new Intent();
intent.putExtra("pdus", new Object[] { mockSmsWrapper.get() });
intent.setType("vnd.android-dir/mms-sms");
receiver.onReceive(getContext(), intent);
//TODO: Verify results!
}
}
Интересно, если это какая-то проблема с Context
, некоторые данные не установлено в намерение (отсюда Call while result is not pending
) или если даже можно проверить abortBroadcast()
?
Следует также добавить, что мой TestClass расширяет AndroidTestCase
.
Спасибо!
Вы нашли решение этой проблемы? У меня очень похожая проблема. –
@MarkSmith, нет, не совсем. Однако я придумал обходное решение, которое работает для моих нужд. Обходным путем является создание намерения с помощью действия ex. 'new Intent (ACTION_SKIP_ABORT_BROADCAST)', тогда в моем приемнике я зачитал действие намерения, и если он равен 'ACTION_SKIP_ABORT_BROADCAST', то вызов abortBraodcast()' пропускается. Это, конечно, только для тестовых целей и, возможно, не лучшее решение, но оно работает. – Robert
Спасибо. Я придумал аналогичное обходное решение: try/catch the IllegalStateException, так как я ничего не могу с этим поделать. –