如何使用Robolectric测试BroadcastReceiver的setResultData()

时间:2015-08-11 08:31:44

标签: android broadcastreceiver robolectric

我的BroadcastReceiver收到Intent.ACTION_NEW_OUTGOING_CALL。它需要拨打this.setResultData(null),以便随后拨打该号码,如here所述。

这很好用。

如何使用Robolectric进行测试?

这就是我所拥有的:

// Create the intent
Intent myIntent = new Intent("Intent.ACTION_NEW_OUTGOING_CALL");
myIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, "123");

// Find my BroadcastReceiver
List<BroadcastReceiver> receivers = ShadowApplication.getInstance().getReceiversForIntent(myIntent);
MyReceiver receiver = (MyReceiver)receivers.get(0);

// Invoke it - I understand this is the correct way to do it in a Robolectric test
Context context = ShadowApplication.geInstance().getApplicationContext();
receiver.onReceive(context, myIntent);

我的广播接收器已启动,但在调用setResultData()时会引发异常:java.lang.IllegalStateException: Call while result is not pending。这是因为基础BroadcastReceiver的状态,因为setResultData() - &gt; checkSynchronousHint()发现mPendingResult==null

mPendingResult只能由setPendingResult()设置为非空,我无法调用(即使使用反射)。

测试BroadcastReceiver需要致电setResultData()的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我已经尝试重现您的问题但无法解决。

查看我的测试https://github.com/emartynov/robolectic-experiments/blob/master/robolectric-3.0-test/src/test/java/com/bijdorpstudio/myapplication/IncomingCallReceiverTest.java

但是,我无法通过 AndroidManifest.xml 让Robolectric获取BroadcastReceiver。在测试中手动添加。

我觉得这样做很好。我会在 AndroidManifest.xml 中添加一些xml测试以进行正确的BroadcastReceiver标记。测试android正确选择它仍然是我的最低优先级任务