Unit test de repositorio con Mocktail en Flutter: ejercicio resuelto
Unit test de repositorio con Mocktail en Flutter: ejercicio resuelto
Testear solo la UI no es suficiente. La lógica de negocio en repositorios y casos de uso necesita sus propios tests unitarios, aislados de la red y de Flutter. mocktail permite crear mocks sin generación de código, lo que simplifica el setup considerablemente.
Enunciado
Diseña un contrato PostRepository, un caso de uso GetPostsUseCase que filtra posts vacíos, y escribe tests unitarios que verifiquen el comportamiento correcto ante éxito y error, mockeando el repositorio.
Dependencias
Solución: clases de dominio
Solución: tests con Mocktail
Cómo ejecutar los tests
Resultado esperado
Tres casos pasan: lista filtrada y ordenada, excepción propagada, lista vacía.
Errores frecuentes
- Mock no configurado: olvidar
when(...)antes de llamar al método mockeado lanzaMissingStubError. Configura el mock ensetUpo al inicio del test. - Igualdad no implementada en el modelo: si
Postno sobreescribe==,expect(result, [Post(...)])siempre falla aunque los valores sean iguales. - Verificar interacciones sin haber establecido el mock:
verifyfunciona sobre mocks de mocktail, no sobre instancias reales.
Por qué vale la pena escribir estos tests
- Se ejecutan en milisegundos, sin emulador ni red.
- Documentan el comportamiento esperado de la lógica de negocio.
- Detectan regresiones cuando cambias el caso de uso o el repositorio.
- Sirven de especificación ejecutable para el equipo.
Aplicación práctica
Cualquier caso de uso en una app con arquitectura limpia se beneficia de tests de este tipo: filtrado de listas, transformación de datos, reglas de negocio (descuentos, validaciones, permisos).
Siguiente ejercicio recomendado
- Mock API en tests de Flutter: ejercicio resuelto
- Integration test de login en Flutter: ejercicio resuelto
- Repositorio y casos de uso en Flutter: ejercicio resuelto
- Todos los ejercicios de Flutter
Práctica guiada y siguiente paso
- Más ejercicios de Flutter
- Ejercicios C para reforzar fundamentos
- Programación en C en 100 ejercicios resueltos
- Ver el libro en Amazon (incluido en Kindle Unlimited)
- Suscribirte a la newsletter
FAQ
¿Por qué Mocktail en lugar de Mockito?
Mocktail no requiere generación de código con build_runner. Escribes el mock con una línea y los tests corren sin pasos previos.
¿Cuándo usar thenAnswer vs thenReturn?
Usa thenReturn para valores sincrónicos. Usa thenAnswer cuando el stub devuelve un Future o Stream.
¿Dónde pongo los tests de repositorio en el proyecto?
En test/domain/ si sigues arquitectura limpia. La convención es espejar la estructura de lib/ dentro de test/.