使用Robolectric对RecyclerView的OnItemTouchListener进行单元测试

3
所以在我的测试中调用这个方法来布局RecyclerView之后:
recyclerView.addOnItemTouchListener(listener);
recyclerView.measure(0, 0); 
recyclerView.layout(0, 0, 100, 10000);

我的 OnItemTouchListener 如下:

listener = new RecyclerOnTouchListener(this, new RecyclerOnTouchListener.OnItemClickListener() {
                        @Override
                        public void onItemClick(View v, int position) {
                            Toast.makeText(this, "Sample toast", Toast.LENGTH_SHORT).show();
                        }
                    });

我想要断言:

Assertions.assertThat(ShadowToast.getTextOfLatestToast()).isEqualToIgnoringCase("Sample Toast");

我需要在RecyclerView上模拟项目点击。我正在做的是这样的:
recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick();
recyclerView.performClick()

它们都返回false,意味着没有调用它们中的onclick监听器。

那么我们如何在RecyclerView中真正测试OnItemTouchListener?在Robolectric中怎么做?

任何帮助将不胜感激。谢谢!

2个回答

1

我曾遇到类似的问题,通过在setAdapter之前添加以下代码解决:

    recyclerView.setLayoutManager(LinearLayoutManager(this))

0

我遇到了同样的问题,虽然我没有找到任何好的解决方案,但我有一个解决方法,至少可以让测试变得可能,直到我找到更好的方法。

你可以在你的活动中创建一个方法,并让onClick监听器直接调用它。

void recyclerOnClick(View view, int position) {
    Toast.makeText(this, "Click", Toast.LENGTH_SHORT).show();
}

void addTouchListener() {
    RecyclerOnTouchListener touchListener = new RecyclerOnTouchListener(this, recyclerView,
            new RecyclerOnTouchListener.OnItemClickListener() {
                @Override
                public void onClick(@NotNull View view, int position) {
                    recyclerOnClick(view, position);
                }
            });
    recyclerView.addOnItemTouchListener(touchListener)
}

然后在你的测试中,你只需要调用adapter.recyclerOnClick()来模拟你想要点击的视图。


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