Espresso之RecyclerView

陆弘光
2023-12-01

测试RecyclerView需要导入

androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.2.0'

使用示例

//actionOnItemAtPosition的第一个参数是recycleview的item位置
//第二个参数是对应的动作
Espresso.onView(ViewMatchers.withId(R.id.recyclerView)).perform(
        RecyclerViewActions.actionOnItemAtPosition<BaseViewHolder>(2
            , ViewActions.click()))

测试RecyclerView的item的子view则需要自定义Matcher

import android.content.res.Resources;
import android.view.View;
import androidx.recyclerview.widget.RecyclerView;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import java.util.Objects;

public class RecyclerViewMatcher {
    private final int recyclerViewId;

    public RecyclerViewMatcher(int recyclerViewId) {
        this.recyclerViewId = recyclerViewId;
    }

    public Matcher<View> atPosition(final int position) {
        return atPositionOnView(position, -1);
    }

    public Matcher<View> atPositionOnView(final int position, final int targetViewId) {

        return new TypeSafeMatcher<View>() {
            Resources resources = null;
            View childView;

            public void describeTo(Description description) {
                String idDescription = Integer.toString(recyclerViewId);
                if (this.resources != null) {
                    try {
                        idDescription = this.resources.getResourceName(recyclerViewId);
                    } catch (Resources.NotFoundException var4) {
                        idDescription = String.format("%s (resource name not found)", recyclerViewId);
                    }
                }

                description.appendText("with id: " + idDescription);
            }

            public boolean matchesSafely(View view) {

                this.resources = view.getResources();

                if (childView == null) {
                    RecyclerView recyclerView = view.getRootView().findViewById(recyclerViewId);
                    if (recyclerView != null && recyclerView.getId() == recyclerViewId) {
                        childView = Objects.requireNonNull(recyclerView.findViewHolderForAdapterPosition(position)).itemView;
                    } else {
                        return false;
                    }
                }

                if (targetViewId == -1) {
                    return view == childView;
                } else {
                    View targetView = childView.findViewById(targetViewId);
                    return view == targetView;
                }

            }
        };
    }
}

使用示例

Espresso.onView(RecyclerViewMatcher(R.id.recyclerView).atPositionOnView(3,R.id.button))
    .perform(ViewActions.click())

参考:

https://github.com/dannyroa/espresso-samples

 

 类似资料: