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

Original source