Coincidentes de vista personalizada

Espresso ofrece varias opciones para crear nuestros propios comparadores de vistas personalizados y se basa en los comparadores Hamcrest. Custom matcher es un concepto muy potente para ampliar el framework y también para personalizar el framework a nuestro gusto. Algunas de las ventajas de escribir comparadores personalizados son las siguientes:

  • Para aprovechar la característica única de nuestras propias vistas personalizadas

  • El comparador personalizado ayuda en los casos de prueba basados en AdapterView a coincidir con los diferentes tipos de datos subyacentes.

  • Para simplificar los comparadores actuales mediante la combinación de características de varios comparadores

Podemos crear un nuevo comparador cuando surja la demanda y es bastante fácil. Creemos un nuevo comparador personalizado, que devuelve un comparador para probar tanto la identificación como el texto de un TextView .

Espresso ofrece las siguientes dos clases para escribir nuevos comparadores:

  • TypeSafeMatcher

  • BoundedMatcher

Ambas clases son de naturaleza similar excepto que BoundedMatcher maneja de manera transparente la conversión del objeto al tipo correcto sin verificar manualmente el tipo correcto. Crearemos un nuevo comparador, con IdAndText usando la clase BoundedMatcher . Revisemos los pasos para escribir nuevos comparadores.

  • Agregue la siguiente dependencia en el archivo app / build.gradle y sincronícela.

dependencies {
   implementation 'androidx.test.espresso:espresso-core:3.1.1'
}
  • Cree una nueva clase para incluir nuestros comparadores (métodos) y márquela como final

public final class MyMatchers {
}
  • Declare un método estático dentro de la nueva clase con los argumentos necesarios y establezca Matcher <View> como tipo de retorno.

public final class MyMatchers {
   @NonNull
   public static Matcher<View> withIdAndText(final Matcher<Integer>
   integerMatcher, final Matcher<String> stringMatcher) {
   }
}
  • Cree un nuevo objeto BoundedMatcher (valor de retorno también) con la siguiente firma dentro del método estático,

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) {
      };
   }
}
  • Invalidar describeTo y matchesSafely métodos en el BoundedMatcher objeto. describeTo tiene un solo argumento de tipo Descripción sin tipo de retorno y se usa para obtener información de error con respecto a los comparadores. MatchSafely tiene un solo argumento de tipo TextView con tipo de retorno booleano y se usa para hacer coincidir la vista.

La versión final del código es la siguiente,

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());
         }
      };
   }
}
  • Finalmente, podemos usar nuestro comparador de mew para escribir el caso de prueba como se muestra a continuación,

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