2013-11-30 4 views
0

Я начинаю писать тесты для своего приложения для 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.

Спасибо!

+0

Вы нашли решение этой проблемы? У меня очень похожая проблема. –

+0

@MarkSmith, нет, не совсем. Однако я придумал обходное решение, которое работает для моих нужд. Обходным путем является создание намерения с помощью действия ex. 'new Intent (ACTION_SKIP_ABORT_BROADCAST)', тогда в моем приемнике я зачитал действие намерения, и если он равен 'ACTION_SKIP_ABORT_BROADCAST', то вызов abortBraodcast()' пропускается. Это, конечно, только для тестовых целей и, возможно, не лучшее решение, но оно работает. – Robert

+0

Спасибо. Я придумал аналогичное обходное решение: try/catch the IllegalStateException, так как я ничего не могу с этим поделать. –

ответ

0

Ваш результат вызван непосредственно методом onReceive.

Вместо этого, вы должны сделать следующее:

Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED"); 
intent.putExtra("pdus", new Object[] { mockSmsWrapper.get() }); 
intent.setType("vnd.android-dir/mms-sms"); 

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,intent ,PendingIntent.FLAG_ONE_SHOT); 
try { 
    pendingIntent.send(0); 
} catch (CanceledException e) { 
    Log.e(YourClass.class.getSimpleName(), android.util.Log.getStackTraceString(e)); 
} 
Thread.sleep(2000); 
//Verify result 
+0

Я пробовал ваше решение сейчас и не получаю ошибок, но похоже, что мой приемник не вызван, есть ли что-то еще, что я пропустил? – Robert

Смежные вопросы