I have an Android app that uses fragments and implemented ActionBarCompat. I wrote a simple Robolectric test, shown below:
@Test public void shouldNotBeNull() throws Exception { MainFragment mainFragment = new MainFragment(); startFragment(mainFragment); assertThat(mainFragment, notNullValue()); assertThat(mainFragment.getActivity(), notNullValue()); } private void startFragment(MainFragment fragment) { FragmentActivity activity = new FragmentActivity(); shadowOf(activity).callOnCreate(null); shadowOf(activity).callOnStart(); shadowOf(activity).callOnResume(); FragmentManager fragmentManager = activity.getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(fragment, null); fragmentTransaction.commit(); }
I get the following exception:
java.lang.NullPointerException: null at android.app.Activity.invalidateOptionsMenu(Activity.java:2595) at android.support.v4.app.ActivityCompatHoneycomb.invalidateOptionsMenu(ActivityCompatHoneycomb.java:30) at android.support.v4.app.FragmentActivity.supportInvalidateOptionsMenu(FragmentActivity.java:572) at android.support.v4.app.Fragment.setHasOptionsMenu(Fragment.java:708) at com.example.android.ui.MainFragment.onCreate(MainFragment.java:599) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:834) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420) at org.robolectric.util.Scheduler.postDelayed(Scheduler.java:37) at org.robolectric.shadows.ShadowLooper.post(ShadowLooper.java:198) at org.robolectric.shadows.ShadowHandler.postDelayed(ShadowHandler.java:56) at org.robolectric.shadows.ShadowHandler.post(ShadowHandler.java:51) at android.os.Handler.post(Handler.java) at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1322) at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541) at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525) at com.example.android.ui.MainFragmentTest.startFragment(MainFragmentTest.java:36) at com.example.android.ui.MainFragmentTest.shouldNotBeNull(MainFragmentTest.java:22)
When using something like this:
MainActivity activity = new MainActivity(); shadowOf(activity).callOnCreate(null); shadowOf(activity).callOnStart(); shadowOf(activity).callOnResume();
where MainActivity is the owner activity for MainFragment, I get the following exception:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at org.robolectric.res.builder.RobolectricPackageManager.getActivityInfo(RobolectricPackageManager.java:59) at android.support.v7.app.ActionBarActivityDelegate.getUiOptionsFromMetadata(ActionBarActivityDelegate.java:157) at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:53) at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98) at com.example.android.ui.MainActivity.onCreate(MainActivity.java:45) at org.robolectric.shadows.ShadowActivity.invokeReflectively(ShadowActivity.java:176) at org.robolectric.shadows.ShadowActivity.callOnCreate(ShadowActivity.java:121) at com.example.android.ui.MainFragmentTest.startFragment(MainFragmentTest.java:28) at com.example.android.ui.MainFragmentTest.shouldNotBeNull(MainFragmentTest.java:22)
I suspect it could be something like ActionBarCompat and Robolectric, which are incompatible. Any help would be appreciated.
source share