RecyclerView 에 대한 테스트는 AdapterView 나 ListView 와는 다릅니다.
RecyclerView 를 테스트하기 위해서는 먼저 espresso-contrib 패키지를 앱 수준의 build.gradle 내 dependencies 에 추가해야 합니다.
RecyclerViewActions
리사이클러뷰의 스크롤은 일반적인 scrollTo() 액션으로 수행할 수 없습니다.
espresso-contrib 패키지에서 제공하는 RecyclerViewActions 클래스를 사용해야 합니다.
한 마디로 리사이클러뷰를 위한 ViewActions 클래스라고 보시면 되겠습니다.
이를 사용하기 위해서는 onView(matcher) 메소드에서 Matcher 를 이용하여 테스트 하고자 하는 RecyclerView 를 찾아 냅니다. 그리고 그 후에 반환된 결과에 perform(...) 메소드의 파라미터로 RecyclerViewActions 의 메소드를 사용하시면 되겠습니다.
RecyclerViewActions 에서 제공하는 메소드는 다음과 같습니다.
먼저, actionOnXXX() 메소드는 첫 번째 파라미터를 통해 View나 Item을 찾은 후에 두 번째 파라미터로 받은 ViewAction 을 수행합니다.
- actionOnHolderItem(Matcher viewHolderMatcher, ViewAction viewAction)
- actionOnItem(Matcher itemViewMatcher, ViewAction viewAction)
- actionOnItemAtPosition(int position, ViewAction viewAction)
다음으로 scrollToXXX() 메소드는 파라미터에 매칭되는 View 까지 RecyclerView 를 scroll 한 다음 해당 ViewAction 을 반환합니다.
- scrollTo(Matcher itemViewMatcher)
- scrollToHolder(Matcher viewHolderMatcher)
- scrollToPosition(int position)
TypeSafeMatcher
Android 에서 제공하는 View 가 아닌, 개발자가 직접 작성한 ViewHolder 나 Item 클래스에 대해서는 기존에 제공해주던 matcher 만으로는 한계가 있습니다.
이럴 때 Matcher 인터페이스를 직접 구현하면 되는데요. 그중 TypeSafeMatcher<T> 를 구현하는 방법이 가장 널리 사용됩니다. TypeSafeMatcher 는 특정 타입(T)의 non-null value 를 요구하는 Matcher 입니다.
구현할 때에 중요한 포인트는 matchesSafely(T t) 입니다. 여기에서 true 를 리턴하는 조건에 한하여 찾고자 하는 대상을 찾을 수 있습니다.
다음은 CustomAdapter 내에 CustomViewHolder 를 정의하고, position 이 0인 ViewHolder 에 대해서만 isHeader 값이 true 라고 구현 했을 때 이 ViewHolder 를 탐색 해내는 TypeSafeMatcher 예시입니다.
private static Matcher<CustomAdapter.CustomViewHolder> isHeader() {
return new TypeSafeMatcher<CustomAdapter.CustomViewHolder>() {
@Override
protected boolean matchesSafely(CustomAdapter.CustomViewHolder customHolder) {
return customHolder.getIsHeader();
}
@Override
public void describeTo(Description description) {
description.appendText("item is the title.");
}
};
}
참고로, TypeSafeMatcher<T> 가 꼭 리사이클러뷰 테스트에서만 사용 돼야 하는 클래스는 아닙니다.
참고. 구글이 제공하는 샘플
android/testing-samples
A collection of samples demonstrating different frameworks and techniques for automated testing - android/testing-samples
github.com
'Android > Test' 카테고리의 다른 글
| [Android Test] 1) Robolectric 이란? (0) | 2020.03.11 |
|---|---|
| [Android UI Test] 6) Espresso 를 활용한 WebView Test (0) | 2020.03.10 |
| [Android UI Test] 4) Espresso Intended 와 Intending (0) | 2020.03.08 |
| [Android UI Test] 3) Espresso API 제대로 알고 사용하기 (0) | 2020.03.07 |
| [Android UI Test] 2) Espresso 설치 및 환경 구축 (0) | 2020.03.06 |