首页 > 解决方案 > 如何使用 AndroidX 片段测试来测试选项菜单?

问题描述

设置

背景

AndroidX 带来了测试片段的新方法:

来源: https ://developer.android.com/training/basics/fragments/testing

Robolectric 与 AndroidX 兼容,并打算弃用反映 AndroidX 功能的功能。

来源: http ://robolectric.org/androidx_test/

但是在 Robolectric 中,您可以测试选项菜单的行为,例如使用类似这样的东西(我知道它看起来很混乱,但 FragmentController 在某些情况下不能很好地工作):

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

在 AndroidX 中执行类似操作(不使用 espresso)的 API 是什么?该RoboMenu构造似乎不适用于 AndroidX,这不起作用:

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

标签: robolectricandroidx-test

解决方案


推荐阅读