android - 如何使用 Espresso 为 RecyclerView 中的项目设置 IdlingResource?

标签 android android-recyclerview android-espresso

我有一个 Activity 。它包含 fragment ,这个 fragment 有 RecyclerView。从服务器加载的一些数据并显示在 RecyclerView 的第一项中。

我需要为此项目设置 IdlingResource。所以当数据将从服务器加载并显示在这个项目中时,测试必须开始。

如何为 RecyclerView 中的项目设置 IdlingResource?

最佳答案

RecyclerView 上的 IdlingResource

我不确定我们是如何使用它的,但它确实有效...

在你的 fragment 中:

    public interface RecyclerViewHaveDataListener {
        void recyclerViewHaveData();
    }

    private RecyclerViewHaveDataListener callbackIdl;

    @VisibleForTesting
    public void registerOnCallBackIdl(RecyclerViewHaveDataListener callbackIdl){
      this.callbackIdl = callbackIdl;
      if (adapter.getItemCount() > 0){
          this.callbackIdl.recyclerViewHaveData();
          this.callbackIdl = null;
      }
    }

     // Use this where you add your datas to your RecyclerView by your adapter
     if (callbackIdl != null && adapter.getItemCount() > 0){
            callbackIdl.recyclerViewHaveData();
            callbackIdl = null;
     }

在您的测试包中:

public class RecyclerViewIdlingRes implements IdlingResource, YourFragment.RecyclerViewHaveDataListener {

    private String name;
    private boolean isIdle;

    private volatile ResourceCallback resourceCallback;

    public RecyclerViewIdlingRes(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public boolean isIdleNow() {
        return isIdle;
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback callback) {
        this.resourceCallback = callback;
    }

    @Override
    public void recyclerViewHaveData() {
        if (resourceCallback == null){
            return;
        }
        isIdle = true;
        resourceCallback.onTransitionToIdle();
    }
}

在您的测试中:

    @Test
    public void itemIsComming(){
        RecyclerViewIdlingRes mIdl = new RecyclerViewIdlingRes("idlingRecyclerView");
        IdlingRegistry.getInstance().register(mIdl);
        Fragment fragment = activity.getSupportFragmentManager().findFragmentById(R.id.activity_main_frame_layout);
        if (fragment instanceof YourFragment) {
            ((YourFragment)fragment).registerOnCallBack(mIdl);
        }
        onIdle();
        IdlingRegistry.getInstance().unregister(mIdl);

        // DO YOUR STUFF...
     }

关于android - 如何使用 Espresso 为 RecyclerView 中的项目设置 IdlingResource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35635195/

相关文章:

java - 如何创建其中包含文本和图像的框

android - 与 Robolectric 一起运行时 Mockito 测试中的 SecurityProvider

android - intent-filter 不适用于 android 中的 ActivityTestRule

java - @Before 注释在 espresso 测试中被 kotlin 忽略?

android - 如何在 espresso webview 中选择下拉列表选项

Android,传感器方向不会改变

android - 如何在 android oreo(8.0) 上将应用程序启动器图标添加到主屏幕?

1 个 fragment 布局上的 Android 多个 RecyclerView(水平和垂直)

android - RecyclerView "cannot resolve symbol"错误 - Android Studio

java - 具有不同布局的多个回收器 View