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.