单元测试 RecyclerView OnItemTouchListener Robolectric

Unit Testing RecyclerView OnItemTouchListener Robolectric

所以在我的测试中调用它来布局 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()

并且它们都 return false,这意味着它们中没有 onclick 侦听器被调用。

那么我们如何在 recyclerview 中真正测试 OnItemTouchListener?在 Robolectric?

如有任何帮助,我们将不胜感激。谢谢!

我有一个类似的问题,通过在 setAdapter 之前添加行得到解决:

    recyclerView.setLayoutManager(LinearLayoutManager(this))

我 运行 遇到了同样的问题,虽然我没有找到任何好的解决方案,但我有一个解决方法,至少可以在我找到更好的方法之前进行测试。

您可以做的一件事是在 activity 中创建一个方法并让 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()