Benutzerdefinierte Ansichts-Matcher
Espresso bietet verschiedene Optionen zum Erstellen eigener benutzerdefinierter Ansichts-Matcher und basiert auf Hamcrest-Matchern . Custom Matcher ist ein sehr leistungsfähiges Konzept, um das Framework zu erweitern und das Framework nach unserem Geschmack anzupassen. Einige der Vorteile des Schreibens von benutzerdefinierten Matchern sind folgende:
Um die einzigartige Funktion unserer eigenen benutzerdefinierten Ansichten zu nutzen
Benutzerdefinierter Matcher hilft in den AdapterView- basierten Testfällen, mit dem unterschiedlichen Typ der zugrunde liegenden Daten übereinzustimmen .
Vereinfachung der aktuellen Matcher durch Kombination der Funktionen mehrerer Matcher
Wir können neue Matcher erstellen, sobald die Nachfrage steigt und es ganz einfach ist. Lassen Sie uns einen neuen benutzerdefinierten Matcher erstellen, der einen Matcher zurückgibt, um sowohl die ID als auch den Text einer Textansicht zu testen .
Espresso bietet die folgenden zwei Klassen, um neue Matcher zu schreiben:
TypeSafeMatcher
BoundedMatcher
Beide Klassen sind ähnlicher Natur, mit der Ausnahme, dass der BoundedMatcher die Umwandlung des Objekts in den richtigen Typ transparent handhabt, ohne manuell nach dem richtigen Typ zu suchen . Wir werden einen neuen Matcher mit IdAndText unter Verwendung der BoundedMatcher- Klasse erstellen . Lassen Sie uns die Schritte überprüfen, um neue Matcher zu schreiben.
Fügen Sie die folgende Abhängigkeit in die Datei app / build.gradle ein und synchronisieren Sie sie.
dependencies {
implementation 'androidx.test.espresso:espresso-core:3.1.1'
}
Erstellen Sie eine neue Klasse, die unsere Matcher (Methoden) enthält, und markieren Sie sie als endgültig
public final class MyMatchers {
}
Deklarieren Sie eine statische Methode innerhalb der neuen Klasse mit den erforderlichen Argumenten und legen Sie Matcher <Ansicht> als Rückgabetyp fest.
public final class MyMatchers {
@NonNull
public static Matcher<View> withIdAndText(final Matcher<Integer>
integerMatcher, final Matcher<String> stringMatcher) {
}
}
Erstellen Sie ein neues BoundedMatcher-Objekt (auch Rückgabewert) mit der folgenden Signatur in der statischen Methode.
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) {
};
}
}
Außer Kraft setzen describeTo und matchesSafely Methoden im BoundedMatcher Objekt. descriptionTo hat ein einzelnes Argument vom Typ Description ohne Rückgabetyp und wird verwendet, um Informationen zu Matchern zu verwechseln. ÜbereinstimmungenSafely hat ein einzelnes Argument vom Typ TextView mit dem Rückgabetyp Boolean und wird zum Abgleichen der Ansicht verwendet.
Die endgültige Version des Codes lautet wie folgt:
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());
}
};
}
}
Schließlich können wir unseren Mew Matcher verwenden, um den Testfall wie unten beschrieben zu schreiben.
@Test
public void view_customMatcher_isCorrect() {
onView(withIdAndText(is((Integer) R.id.textView_hello), is((String) "Hello World!")))
.check(matches(withText("Hello World!")));
}