Dominando las aserciones fluidas en Android con AssertJ-Android

La legibilidad es un factor crítico en el mantenimiento de pruebas unitarias y de instrumentación. AssertJ-Android es una extensión de la popular biblioteca AssertJ, diseñada específicamente para el ecosistema Android. Su objetivo principal es transformar las aserciones tradicionales y verbosas en sentencias fluidas y descriptivas que reflejen mejor la intención del desarrollador.

Ventajas de las aserciones fluidas

En el desarrollo estándar con JUnit, verificar el estado de un componente de la interfaz de usuario suele requerir múltiples líneas o llamadas a métodos de acceso. AssertJ-Android simplifica este proceso mediante una API encadenable.

Por ejemplo, una validación convencional de visibilidad se vería así:

// JUnit tradicional
assertEquals(View.GONE, vistaPrevia.getVisibility());

Con AssertJ-Android, el código se vuelve mucho más natural:

// AssertJ-Android
assertThat(vistaPrevia).isGone();

Configuración del entorno en Android Studio

Para integrar esta biblioteca en un proyecto basado en Gradle, es necesaroi añadir las dependencias correspondientes en el archivo build.gradle del módulo de la aplicación. Se recomienda utilizar las variantes que mejor se adapten a la arquitectura del proyecto (AndroidX o Support Library).

dependencies {
    // Soporte para componentes base de AndroidX
    testImplementation 'org.assertj:assertj-android:2.0.0'
    
    // Extensiones para AppCompat
    testImplementation 'org.assertj:assertj-android-appcompat-v7:2.0.0'
    
    // Soporte para componentes de diseño (Material Design)
    testImplementation 'org.assertj:assertj-android-design:2.0.0'
}

Casos de uso prácticos

Validación de componentes de UI

Consideremos un escenario donde necesitamos verificar el comportamiento de un botón de confirmación tras una acción del usuario. Podemos validar múltiples atributos en una sola cadena de comandos.

import static org.assertj.android.api.Assertions.assertThat;

@Test
public void validarEstadoBotonConfirmacion() {
    Button btnConfirmar = activity.findViewById(R.id.btn_enviar);
    
    // Verificación de estado y disponibilidad
    assertThat(btnConfirmar)
        .isEnabled()
        .isVisible()
        .hasText("Confirmar Registro");
}

Pruebas de contenido en TextView

Además del texto simple, podemos evaluar propiedades visuales como el color o las refernecias a recursos de cadena, facilitando la validación de temas y estilos.

@Test
public void verificarEtiquetaError() {
    TextView txtError = activity.findViewById(R.id.label_error_message);
    
    assertThat(txtError)
        .hasCurrentTextColor(Color.RED)
        .containsText("inválido")
        .hasTypeface(Typeface.BOLD);
}

Verificación de objetos Intent

La comunicación entre Activities mediante Intents es fundamental. AssertJ-Android permite inspeccionar los "extras" y la configuración del Intent de forma sencilla.

@Test
public void validarNavegacionConParametros() {
    Intent intentDestino = new Intent(contexto, PerfilActivity.class);
    intentDestino.putExtra("USER_ID", "admin_01");
    intentDestino.putExtra("IS_PRO", true);

    assertThat(intentDestino)
        .hasComponent(contexto, PerfilActivity.class)
        .hasExtra("USER_ID", "admin_01")
        .hasExtra("IS_PRO", true);
}

Integración con Espresso para pruebas de UI

Aunque Espreso tiene su propio sistema de "matchers", AssertJ-Android puede utilizarse para realizar comprobaciones adicionales sobre el estado de la Activity o fragmentos una vez que la interacción ha finalizado.

@Test
public void flujoDeAutenticacionExitosa() {
    // Interacción con Espresso
    onView(withId(R.id.input_usuario)).perform(typeText("usuario_demo"));
    onView(withId(R.id.input_password)).perform(typeText("12345"), closeSoftKeyboard());
    onView(withId(R.id.btn_login)).perform(click());

    // Verificación de estado de la Activity con AssertJ-Android
    assertThat(activity).isFinishing();
}

Compatibilidad de componentes

La biblioteca cubre una amplia gama de las API de Android, incluyendo pero no limitado a:

  • Views: Visibilidad, dimensiones, estados de enfoque.
  • Adapters: Recuento de elementos y validación de datos internos.
  • Widgets: ProgressBar, CheckBox, Spinner, entre otros.
  • System: SharedPreferences, Notification y servicios de sistema.

Etiquetas: android-testing assertj unit-testing espresso android-studio

Publicado el 8-12 11:12