How to test that an intent has been broadcasted
I am broadcasting an intent when a "record" button is clicked. a boolean variable is passed, that shows whether the recording is started or not. The code to generate an intent is:
Intent recordIntent = new Intent(ACTION_RECORDING_STATUS_CHANGED);
recordIntent.putExtra(RECORDING_STARTED, getIsRecordingStarted());
sendBroadcast(recordIntent);
To test this code I have registered a receiver in test. The intent is received but the variable passed is not the same. If I debug the code, I can see that the value is same as it is sent, but when I get it, its not the same value.
@Test
public void pressingRecordButtonOnceGenerateStartRecordingIntent()
throws Exception {
// Assign
AppActivity activity = new AppActivity();
activity.onCreate(null);
activity.onResume();
activity.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent intent) {
// Assert
ShadowIntent shadowIntent = Robolectric.shadowOf(intent);
assertThat(shadowIntent
.hasExtra(AppActivity.RECORDING_STARTED),
equalTo(true));
Boolean expected = true;
Boolean actual = shadowIntent.getExtras().getBoolean(
AppActivity.RECORDING_STARTED, false);
assertThat(actual, equalTo(expected));
}
}, new IntentFilter(
AppActivity.ACTION_RECORDING_STATUS_CHANGED));
ImageButton recordButton = (ImageButton) activity
.findViewById(R.id.recordBtn);
// Act
recordButton.performClick();
ShadowHandler.idleMainLooper();
}
I have also tested against the actual intent instead of its shadow, but same result
使用get()而不是getBoolean()为我工作。
public void pressingRecordButtonOnceGenerateStartRecordingIntent()
throws Exception {
// Assign
BreathAnalyzerAppActivity activity = new AppActivity();
activity.onCreate(null);
activity.onResume();
activity.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent intent) {
// Assert
assertThat(intent
.hasExtra(AppActivity.RECORDING_STARTED),
equalTo(true));
Boolean expected = true;
Boolean actual = (Boolean)intent.getExtras().get(
AppActivity.RECORDING_STARTED);
assertThat(actual, equalTo(expected));
}
}, new IntentFilter(
AppActivity.ACTION_RECORDING_STATUS_CHANGED));
ImageButton recordButton = (ImageButton) activity
.findViewById(R.id.recordBtn);
// Act
recordButton.performClick();
ShadowHandler.idleMainLooper();
}
This might not help for the original, but, future people: if you happen to find yourself in this situation - firstly check your constants and intent filters are distinct so that an unintentional broadcast is not received by your receiver. Several times I've spent longer than I care to admit with that issue!
链接地址: http://www.djcxy.com/p/10866.html上一篇: 快速AWS自动缩放
下一篇: 如何测试广播的意图