How to test options menu using AndroidX fragment test?

577 Views Asked by At

Setup

  • Robolectric: 4.2.1
  • AndroidX fragment-testing: 1.1.0-alpha05

Background

With AndroidX comes new ways of testing fragments:

Source: https://developer.android.com/training/basics/fragments/testing

Robolectric is compatible with AndroidX and intends to deprecate functionality that mirrors AndroidX capabilities.

Source: http://robolectric.org/androidx_test/

But in Robolectric you could test the behavior of the options menu, e.g. with something like this (I know it looks cluttered but the FragmentController doesn't work well in some cases):

@Test
public void OnPrepareOptionsMenu_WhenX_ShowsMenuActionsCorrectly() {
   setupX();
   final Bundle instanceState = new Bundle();
   instanceState.putString(FooActivity.ARG_UUID, x.getUuid());
   final FooActivity activity = Robolectric.buildActivity(FooActivity.class)
      .create(instanceState).start().visible().get();
   activity.getSupportFragmentManager().beginTransaction()
      .add(R.id.container_x_fragment_details, fragment).commit();
   final Context context = fragment.requireContext();
   final Menu menu = new RoboMenu(context);
   fragment.onCreateOptionsMenu(menu, new MenuInflater(context));

   fragment.onPrepareOptionsMenu(menu);

   assertThat(menu.findItem(R.id.action_y).isVisible(), is(true));
   assertThat(menu.findItem(R.id.action_z).isVisible(), is(true));
}

What is the API to do something similar (without using espresso) in AndroidX? The RoboMenu construct does not seem to play well with AndroidX and this doesn't work:

fragmentScenario.onFragment(fragment -> {
   final Activity activity = fragment.requireActivity();
   assertThat(activity.findViewById(R.id.y).getVisibility(), is(View.VISIBLE));
   assertThat(activity.findViewById(R.id.z).getVisibility(), is(View.VISIBLE));
});
0

There are 0 best solutions below