Java – How to monitor activities when using Robolectric

How to monitor activities when using Robolectric… here is a solution to the problem.

How to monitor activities when using Robolectric

I’m new to Android and am using Robolectric for unit testing.
I am facing the following issues.

I have an activity to test.

The main activity .java

public class MainActivity extends ActionBarActivity
        implements NavigationDrawerFragment.NavigationDrawerCallbacks {

private NavigationDrawerFragment mNavigationDrawerFragment;

@Override
    protected void onCreate (Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

mNavigationDrawerFragment = (NavigationDrawerFragment)
                getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);

mNavigationDrawerFragment.setUp(
                R.id.navigation_drawer,
                (DrawerLayout) findViewById(R.id.drawer_layout));
    }

@Override
    public void onNavigationDrawerItemSelected (int position) {
        ...
    }
}

This is the test class:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class MainActivityTests {

private ActivityController<MainActivity> controller;
    private MainActivity activity;
    private MainActivity spy;

@Test
    public void onCreate_shouldStartNavigationDrawerFragment () {

controller = Robolectric.buildActivity(MainActivity.class);
        activity = controller.get();
        assertThat(activity).isNotNull();

spy = spy(activity);
        spy.onCreate(null);

verify(spy).onCreate(null);
    }
}

But I get the following exception:

java.lang.IllegalStateException: System services are unavailable to the activity until onCreate() at line spy.onCreate(null).

I’ve been googling for hours and (blindly) tried several workarounds without success. Can anyone guide me?

Solution

That’s my trick. I use attach() before getting the activity to monitor. Test with Robolectric 3.0

private MainActivity spyActivity;

@Before
public void setUp(){

MainActivity activity = Robolectric.buildActivity(MainActivity.class).attach().get();
    spyActivity = spy(activity);

spyActivity.onCreate(null);

}

Related Problems and Solutions