Dopasowania widoku niestandardowego

Espresso zapewnia różne opcje tworzenia własnych niestandardowych dopasowań widoku i jest oparte na dopasowywaniu Hamcrest . Custom matcher to bardzo potężna koncepcja, która rozszerza framework, a także dostosowuje go do naszego gustu. Oto niektóre zalety pisania niestandardowych dopasowań:

  • Aby wykorzystać wyjątkową cechę naszych własnych niestandardowych widoków

  • Dopasowanie niestandardowe pomaga w przypadkach testowych opartych na AdapterView w dopasowaniu do różnych typów danych bazowych.

  • Uproszczenie obecnych dopasowań poprzez połączenie funkcji wielu dopasowań

Możemy stworzyć nowego dopasowania, kiedy pojawi się zapotrzebowanie i jest to całkiem proste. Utwórzmy nowy niestandardowy element dopasowujący, który zwraca element dopasowujący, aby przetestować zarówno identyfikator, jak i tekst TextView .

Espresso zapewnia następujące dwie klasy do pisania nowych dopasowań -

  • TypeSafeMatcher

  • BoundedMatcher

Obie klasy mają podobny charakter, z tym wyjątkiem, że BoundedMatcher w sposób przezroczysty obsługuje rzutowanie obiektu w celu uzyskania poprawnego typu bez ręcznego sprawdzania poprawnego typu. Stworzymy nowy element dopasowujący zIdAndText przy użyciu klasy BoundedMatcher . Sprawdźmy, jak należy pisać nowe dopasowania.

  • Dodaj poniższą zależność w pliku app / build.gradle i zsynchronizuj ją.

dependencies {
   implementation 'androidx.test.espresso:espresso-core:3.1.1'
}
  • Utwórz nową klasę, aby uwzględnić nasze dopasowania (metody) i oznacz ją jako ostateczną

public final class MyMatchers {
}
  • Zadeklaruj statyczną metodę wewnątrz nowej klasy z niezbędnymi argumentami i ustaw Matcher <View> jako typ zwracany.

public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
   }
}
  • Utwórz nowy obiekt BoundedMatcher (również zwracana wartość) z poniższym podpisem wewnątrz metody statycznej,

public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
      return new BoundedMatcher<View, TextView>(TextView.class) {
      };
   }
}
  • Przesłoń metody opisujące i dopasowujSafely w obiekcie BoundedMatcher . OpisTo ma pojedynczy argument typu Opis bez zwracanego typu i jest używany do błędnych informacji dotyczących dopasowań. MatchSafely ma pojedynczy argument typu TextView ze zwracanym typem boolean i jest używany do dopasowania widoku.

Ostateczna wersja kodu wygląda następująco:

public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
      return new BoundedMatcher<View, TextView>(TextView.class) {
         @Override
         public void describeTo(final Description description) {
            description.appendText("error text: ");
            stringMatcher.describeTo(description);
            integerMatcher.describeTo(description);
         }
         @Override
         public boolean matchesSafely(final TextView textView) {
            return stringMatcher.matches(textView.getText().toString()) &&
            integerMatcher.matches(textView.getId());
         }
      };
   }
}
  • Na koniec możemy użyć naszego mew dopasowującego, aby napisać przypadek testowy, jak pokazano poniżej,

@Test
public void view_customMatcher_isCorrect() {
   onView(withIdAndText(is((Integer) R.id.textView_hello), is((String) "Hello World!")))
      .check(matches(withText("Hello World!")));
}