Blog

Android: Benutzerdefinierte ViewMatchers in Espresso

Steven Mulder

Aktualisiert Oktober 22, 2025
2 Minuten

Irgendwie scheint es, dass das Testen in der mobilen Entwicklung immer noch wie ein nachträglicher Gedanke behandelt wird. Mit der Einführung des Espresso-Testframeworks in der Android Testing Support Library hat sich die Situation ein wenig verbessert, aber die Dokumentation ist begrenzt und es kann schwierig sein, Probleme zu beheben. Und Sie werden auf Probleme stoßen, denn das Testen ist schwer zu erlernen, wenn es nur wenige Beispiele gibt, von denen man lernen kann.Wie auch immer, ich habe vor kurzem meinen ersten benutzerdefinierten ViewMatcher für Espresso erstellt und dachte mir, ich würde ihn hier gerne vorstellen. Ich habe ein einfaches Formular mit einigen EditText-Ansichten als Eingabefelder erstellt, und diese Felder sollten eine Fehlermeldung anzeigen, wenn der Benutzer eine ungültige Eingabe eingibt.

[caption id="attachment_16486" align="aligncenter" width="480"]Android TextView mit Fehlermeldung Android TextView mit Fehlermeldung[/caption]

Um dies zu testen, gibt mein Espresso-Test einen ungültigen Wert in eines der Felder ein, drückt auf "Senden" und überprüft, ob das Feld tatsächlich eine Fehlermeldung anzeigt. [java] @Test public void check() { Espresso .onView(ViewMatchers.withId((R.id.email))) .perform(ViewActions.typeText("foo")); Espresso .onView(ViewMatchers.withId(R.id.submit)) .perform(ViewActions.click()); Espresso .onView(ViewMatchers.withId((R.id.email))) .check(ViewAssertions.matches( ErrorTextMatchers.withErrorText(Matchers.containsString("email address is invalid")))); } [/java] Die eigentliche Magie geschieht in der Hilfsklasse ErrorTextMatchers: [java] public final class ErrorTextMatchers { /**

  • Gibt einen Matcher zurück, der {@link TextView}s auf der Grundlage des Werts der Texteigenschaft abgleicht.
  • @param stringMatcher {@link Matcher} von {@link String} mit dem zu übereinstimmenden Text */ @NonNull public static Matcher<Siehe> withErrorText(final Matcher<Zeichenfolge> stringMatcher) { return new BoundedMatcher<Ansicht, TextView>(TextView.class) { @Override public void describeTo(final Beschreibung description) { description.appendText("mit Fehlertext: "); stringMatcher.describeTo(description); } @Override public boolean matchesSafely(final TextView textView) { return stringMatcher.matches(textView.getError().toString()); } }; } } [/java] Die wichtigsten Details der Implementierung sind wie folgt. Wir stellen sicher, dass der Matcher nur mit Kindern der Klasse TextView übereinstimmt, indem wir einen BoundedMatcher aus withErrorText() zurückgeben. Dadurch ist es sehr einfach, die Abgleichslogik selbst in BoundedMatcher.matchesSafely() zu implementieren: Nehmen Sie einfach die Methode getError() von der TextView und geben Sie sie an den nächsten Matcher weiter. Schließlich haben wir eine einfache Implementierung der describeTo() -Methode, die nur dazu dient, Debug-Ausgaben auf der Konsole zu erzeugen. Zusammenfassend lässt sich sagen, dass es ziemlich einfach ist, einen eigenen ViewMatcher zu erstellen. Wer hätte das gedacht? Vielleicht gibt es ja doch noch Hoffnung für das Testen mobiler Anwendungen... Ein Beispielprojekt mit den ErrorTextMatchern finden Sie auf GitHub: github.com/smuldr/espresso-errortext-matcher.

Verfasst von

Steven Mulder

Contact

Let’s discuss how we can support your journey.