1

I have an activity. It contains fragment, and this fragment has RecyclerView. Some data loading from server and showing inside first item of RecyclerView.

I need setup IdlingResource for this item. So when the data will be loaded from server and showing inside this item, tests must starting.

How to setup IdlingResource for item inside RecyclerView?

BArtWell
  • 4,176
  • 10
  • 63
  • 106

2 Answers2

1

IdlingResource on RecyclerView

I'm not sure that's how we use it, but it works...

In YourFragment:

    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;
     }

In Your test package:

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();
    }
}

in your test:

    @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...
     }
Nicolas xx
  • 66
  • 4
0

The good approach will be to implement your own IdlingResource that will notify Espresso when data loading is finished. You can find some example here - How to use Espresso Idling Resource for network calls

Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140