我可以在没有 Activity 的情况下在 Espresso 中测试 RecyclerView 吗?

Can I test a RecyclerView in Espresso without an Activity?

测试 - 我有一个 Espresso 测试套件,旨在使用 RecyclerView 适配器测试一些复杂的决策。

对于一个测试,我打算创建一个 RecyclerView,将其传递给被测适配器,然后确定 children 的正确数量存在,正确的元素可见。

问题 - 我在没有特定 Activity 的情况下单独测试它,这意味着以下代码永远不会通过,因为 RecyclerView 从未布置它的 children:

RecyclerView rv = new RecyclerView(InstrumentationRegistry.getTargetContext());
rv.setAdapter(adap);
assertThat(rv.getChildCount(), is(greaterThan(0)));

我想我可以通过创建一个空的 activity 和一个带有 RecyclerView 的空布局来完成这项工作,但我想避免像那样创建垃圾 类。

问题 - 是否可以让 RecyclerView 像这样单独运行? Espresso 是否有一些我可以访问并附加到的根视图?

CommonsWare 所述,确保 RecyclerView 准备好在没有 activity 的情况下进行测试的方法是自行强制布局。

RecyclerView rv = new RecyclerView(InstrumentationRegistry.getTargetContext());
rv.setLayoutManager(new LinearLayoutManager(InstrumentationRegistry.getTargetContext()));
rv.setAdapter(adapter);
rv.measure(View.MeasureSpec.AT_MOST, View.MeasureSpec.AT_MOST);
rv.layout(0,0, 800, 480); //arbitrary sizes

以这种方式创建视图后,子项数将不再为零

assertThat(rv.getChildCount(), is(greaterThan(0)));

在没有 Activity 的情况下测试 RecyclerView 的一个警告是您无法执行操作。

onView(...).perform(click());

如果没有 activity,此代码将抛出带有消息

的 RuntimeException

No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?