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!")));
}