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 |