How to test that an intent has been broadcasted
android, robolectric, unit-testing
Solution
using the get() instead of getBoolean() worked for me.
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();
}
Problem
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