2016-09-06 2 views
3

Есть ли способ подсчета элементов с определенным идентификатором в эспрессо?Элементы счетчика эспрессо

Я могу сделать onView(withId(R.id.my_id)), но тогда я застрял.

У меня есть LinearLayout, где я вставляю элементы (а не ListView), и я хочу проверить, сколько или сколько нужно проверить, соответствуют ли они ожидаемому поведению.

ответ

2

Вот сличитель, что я придумал:

public static Matcher<View> withViewCount(final Matcher<View> viewMatcher, final int expectedCount) { 
     return new TypeSafeMatcher<View>() { 
      int actualCount = -1; 

      @Override 
      public void describeTo(Description description) { 
       if (actualCount >= 0) { 
        description.appendText("With expected number of items: " + expectedCount); 
        description.appendText("\n With matcher: "); 
        viewMatcher.describeTo(description); 
        description.appendText("\n But got: " + actualCount); 
       } 
      } 

      @Override 
      protected boolean matchesSafely(View root) { 
       actualCount = 0; 
       Iterable<View> iterable = TreeIterables.breadthFirstViewTraversal(root); 
       actualCount = Iterables.size(Iterables.filter(iterable, withMatcherPredicate(viewMatcher))); 
       return actualCount == expectedCount; 
      } 
     }; 
    } 

    private static Predicate<View> withMatcherPredicate(final Matcher<View> matcher) { 
     return new Predicate<View>() { 
      @Override 
      public boolean apply(@Nullable View view) { 
       return matcher.matches(view); 
      } 
     }; 
    } 

и использование является:

onView(isRoot()).check(matches(withViewCount(withId(R.id.anything), 5))); 
+0

У меня возникли проблемы с итерируемыми после обновления до Espresso 3.0.0. Импорт изменился с android.support.test.espresso.core.deps.guava.collect.Iterables; to android.support.test.espresso.core.internal.deps.guava.collect.Iterables; и при этом потерял .size, необходимый для этого кода. –