Android JUnit测试广播接收器在abortBroadcast()上失败

Android JUnit测试广播接收器在abortBroadcast()上失败,android,junit,broadcastreceiver,Android,Junit,Broadcastreceiver,我开始为我的Android应用程序编写测试。它在大多数应用程序中工作正常,但我有一个用于处理传入短信的广播接收器,在某些情况下,该接收器依次调用abortBroadcast()。此小调用导致测试用例失败,出现以下异常: java.lang.IllegalStateException: Call while result is not pending at android.content.BroadcastReceiver.checkSynchronousHint(BroadcastReceive

我开始为我的Android应用程序编写测试。它在大多数应用程序中工作正常,但我有一个用于处理传入短信的广播接收器,在某些情况下,该接收器依次调用
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!
    }
}
public void testOnReceive(){
可选的mockSmsWrapper=TestUtils.createMockSms(getContext(),sender,body);
if(mockSmsWrapper.isPresent()){
SmsReceiver receiver=新的SmsReceiver();
意图=新意图();
intent.putExtra(“PDU”,新对象[]{mockSmsWrapper.get()});
intent.setType(“vnd.android目录/mms短信”);
onReceive(getContext(),intent);
//TODO:验证结果!
}
}
我想知道是不是
上下文
有问题,一些数据没有设置为intent(因此在结果未挂起时调用
),或者是否可以测试
abortBroadcast()

还应添加我的TestClass扩展了
AndroidTestCase


谢谢

您的结果是因为直接调用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

我现在已经尝试了你的解决方案,没有收到任何错误,但似乎我的接收器没有被调用,还有什么我错过的吗?你找到解决方案了吗?“我正面临着一个非常类似的问题。”马克·史密斯,不,不完全是。然而,我想出了一个适合我需要的解决办法。解决方法是使用动作创建意图,例如
新意图(动作跳过中止广播)
然后在我的接收器中读取意图的动作,如果它等于
动作跳过中止广播
,则跳过调用
中止广播()。当然,这只是出于测试目的,可能不是最好的解决方案,但它很有效。谢谢。我想出了一个类似的解决方法:尝试/捕获非法状态异常,因为我对此无能为力。