Как подсчитать элементы RecyclerView с помощью Espresso

Используя Espresso и Hamcrest,

Как я могу подсчитать количество элементов, доступных в recyclerView?

Пример: я хотел бы проверить, отображаются ли 5 ​​элементов в определенном RecyclerView (при необходимости прокручивается).

Здесь пример ViewAssertion для проверки количества элементов RecyclerView

public class RecyclerViewItemCountAssertion implements ViewAssertion { private final int expectedCount; public RecyclerViewItemCountAssertion(int expectedCount) { this.expectedCount = expectedCount; } @Override public void check(View view, NoMatchingViewException noViewFoundException) { if (noViewFoundException != null) { throw noViewFoundException; } RecyclerView recyclerView = (RecyclerView) view; RecyclerView.Adapter adapter = recyclerView.getAdapter(); assertThat(adapter.getItemCount(), is(expectedCount)); } } 

И затем использовать это утверждение

 onView(withId(R.id.recyclerView)).check(new RecyclerViewItemCountAssertion(5)); 

Я начал писать библиотеку, которая должна упростить тестирование с помощью эспрессо и uiautomator. Это включает в себя инструменты для действий и утверждений RecyclerView. https://github.com/nenick/espresso-macchiato См. Например, EspRecyclerView с помощью метода assertItemCountIs (int)

Чтобы полностью ответить на вопрос и предоставить и немного более гибкое решение, чтобы также проверить, если элемент cout больше, меньше, меньше …

 public class RecyclerViewItemCountAssertion implements ViewAssertion { private final Matcher<Integer> matcher; public RecyclerViewItemCountAssertion(int expectedCount) { this.matcher = is(expectedCount); } public RecyclerViewItemCountAssertion(Matcher<Integer> matcher) { this.matcher = matcher; } @Override public void check(View view, NoMatchingViewException noViewFoundException) { if (noViewFoundException != null) { throw noViewFoundException; } RecyclerView recyclerView = (RecyclerView) view; RecyclerView.Adapter adapter = recyclerView.getAdapter(); assertThat(adapter.getItemCount(), matcher); } } 

Применение:

 onView(withId(R.id.recyclerView)).check(new RecyclerViewItemCountAssertion(5)); onView(withId(R.id.recyclerView)).check(new RecyclerViewItemCountAssertion(greaterThan(5)); onView(withId(R.id.recyclerView)).check(new RecyclerViewItemCountAssertion(lessThan(5)); // ... 

Добавление немного синтаксического сахара в ответ @ Стефана .

 public class RecyclerViewItemCountAssertion implements ViewAssertion { private final Matcher<Integer> matcher; public static RecyclerViewItemCountAssertion withItemCount(int expectedCount) { return withItemCount(is(expectedCount)); } public static RecyclerViewItemCountAssertion withItemCount(Matcher<Integer> matcher) { return new RecyclerViewItemCountAssertion(matcher); } private RecyclerViewItemCountAssertion(Matcher<Integer> matcher) { this.matcher = matcher; } @Override public void check(View view, NoMatchingViewException noViewFoundException) { if (noViewFoundException != null) { throw noViewFoundException; } RecyclerView recyclerView = (RecyclerView) view; RecyclerView.Adapter adapter = recyclerView.getAdapter(); assertThat(adapter.getItemCount(), matcher); } } 

Применение:

 import static your.package.RecyclerViewItemCountAssertion.withItemCount; onView(withId(R.id.recyclerView)).check(withItemCount(5)); onView(withId(R.id.recyclerView)).check(withItemCount(greaterThan(5)); onView(withId(R.id.recyclerView)).check(withItemCount(lessThan(5)); // ... 

Я использовал метод ниже, чтобы получить счет RecyclerView

 public static int getCountFromRecyclerView(@IdRes int RecyclerViewId) { int COUNT = 0; Matcher matcher = new TypeSafeMatcher<View>() { @Override protected boolean matchesSafely(View item) { COUNT = ((RecyclerView) item).getAdapter().getItemCount(); return true; } @Override public void describeTo(Description description) { } }; onView(allOf(withId(RecyclerViewId),isDisplayed())).check(matches(matcher)); int result = COUNT; COUNT = 0; return result; } 

Применение –

 int itemsCount = getCountFromRecyclerView(R.id.RecyclerViewId); 

Затем выполните утверждения, чтобы проверить, соответствует ли itemCount как ожидалось.