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));
});