测试RecyclerView是否有数据,使用Espresso

7

我需要编写一个测试来点击我的RecyclerView中的第一项。在某些情况下,RecyclerView可能为空,因此如果我点击索引为0的位置,它将失败。如何编写这样的测试?首先检查recyclerView是否非空,然后再单击特定位置?


你的测试不应该在recyclerview为空时调用error。 - Dmitriy
@Dmitriy 是的。我想确保:1. 列表为空 2. 用户添加了一个元素 3. 现在列表应该只有一个元素。怎么做? :-/ - Slava
Slava,只有在我发布答案后才明白不同的人提出了问题并在上面写了评论)))看看答案。如果您无法适应它,请写信给我。 - Dmitriy
2个回答

14

问题和评论有一些不同的场景。

让我们实现下一个测试场景:如果回收站没有包含任何内容,则不执行任何操作。如果回收站至少有一个元素,点击第一个元素。

@Rule
public final ActivityTestRule<YourActivity> mActivityRule = new ActivityTestRule<>(YourActivity.class);

@Test
public void testSample(){
    if (getRVcount() > 0){
        onView(withId(R.id.our_recycler_view)).perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
    }
}

private int getRVcount(){
    RecyclerView recyclerView = (RecyclerView) mActivityRule.getActivity().findViewById(R.id.our_recycler_view);
    return recyclerView.getAdapter().getItemCount();
}

1
出现空指针异常:java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法'int android.support.v7.widget.RecyclerView$Adapter.getItemCount()' - Surya Reddy
如果我从活动A过渡到活动B,并且recyclerView在活动B中,那该怎么获取它的引用呢? - Starwave

1

针对你的情况,我认为最好使用check方法进行检查。以下是一个示例。

@Test
 fun mainActivityTest() {   
    val yourRecycler = onView(
        allOf(

            childAtPosition(
                withClassName(`is`("androidx.constraintlayout.widget.ConstraintLayout")),
                0
            ),
            instanceOf(RecyclerView::class.java)
        )
    )
    yourRecycler.check { view, noViewFoundException ->
                noViewFoundException?.apply {
                    throw this
                }
                assertTrue(view is RecyclerView &&
                    view.adapter != null && view.adapter?.itemCount?:-1 > 0
                )

            }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接