반응형

RecyclerView 에 대한 테스트는 AdapterViewListView 와는 다릅니다.


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 까지 RecyclerViewscroll 한 다음 해당 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

 

android/testing-samples

A collection of samples demonstrating different frameworks and techniques for automated testing - android/testing-samples

github.com

 

 

반응형
반응형