Correspondances de vue personnalisées

Espresso propose diverses options pour créer nos propres matchers de vue personnalisés et il est basé sur les matchers Hamcrest. Custom matcher est un concept très puissant pour étendre le framework et aussi pour personnaliser le framework à notre goût. Certains des avantages de l'écriture de correspondances personnalisées sont les suivants:

  • Pour exploiter la fonctionnalité unique de nos propres vues personnalisées

  • Le matcher personnalisé aide les cas de test basés sur AdapterView à correspondre aux différents types de données sous-jacentes.

  • Pour simplifier les matchers actuels en combinant les fonctionnalités de plusieurs mateurs

On peut créer un nouveau matcher au fur et à mesure de la demande et c'est assez simple. Créons un nouveau matcher personnalisé, qui renvoie un matcher pour tester à la fois l'ID et le texte d'un TextView .

Espresso fournit les deux classes suivantes pour écrire de nouveaux matchers -

  • TypeSafeMatcher

  • BoundedMatcher

Les deux classes sont de nature similaire, sauf que BoundedMatcher gère de manière transparente le transtypage de l'objet au type correct sans vérifier manuellement le type correct. Nous allons créer un nouveau matcher, withIdAndText en utilisant la classe BoundedMatcher . Laissez-nous vérifier les étapes pour écrire de nouveaux matchers.

  • Ajoutez la dépendance ci-dessous dans le fichier app / build.gradle et synchronisez-la.

dependencies {
   implementation 'androidx.test.espresso:espresso-core:3.1.1'
}
  • Créez une nouvelle classe pour inclure nos correspondants (méthodes) et marquez-la comme finale

public final class MyMatchers {
}
  • Déclarez une méthode statique dans la nouvelle classe avec les arguments nécessaires et définissez Matcher <View> comme type de retour.

public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
   }
}
  • Créez un nouvel objet BoundedMatcher (valeur de retour également) avec la signature ci-dessous dans la méthode statique,

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) {
      };
   }
}
  • Remplacer describeTo et matchesSafely méthodes dans le BoundedMatcher objet. describeTo a un argument unique de type Description sans type de retour et il est utilisé pour les informations d'erreur concernant les correspondants. matchesSafely a un seul argument de type TextView avec un type de retour booléen et il est utilisé pour correspondre à la vue.

La version finale du code est la suivante,

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());
         }
      };
   }
}
  • Enfin, nous pouvons utiliser notre mew matcher pour écrire le cas de test comme ci-dessous,

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