¿Cómo iniciamos la aplicación de películas y sus pruebas?
Empecemos diseñando nuestro propio sistema de pruebas para una aplicación de películas. Primero, nos enfocamos en la parte de lógica de negocio, que es el corazón de la aplicación. Aquí distinguimos entre diferentes componentes, como clases de modelo y dominio. Ya tenemos algunas clases precreadas, como Película con atributos como id, nombre, minutos y género, y la clase Género que define géneros de películas. Además, contamos con un repositorio, que es donde almacenaremos las películas, pero en esta etapa es solo una interfaz.
¿Cómo estructuramos nuestros paquetes y servicios?
Organizamos las clases en diferentes paquetes para mantener la modularidad y claridad del proyecto:
data: Aquí ubicamos el repositorio encargado de interactuar con la base de datos.
modelo: Contiene las clases de modelo o dominio, como Película y Género.
servicio: Incluye la lógica de negocio. En este ejemplo, trabajamos principalmente con MovieService.
La implementación del servicio se centrará en lograr que, por ejemplo, se puedan buscar películas por género. Es clave diseñar pruebas unitarías para validar este comportamiento.
¿Cómo escribimos pruebas efectivas para MovieService?
Las pruebas son esenciales para asegurarnos de que nuestra aplicación funciona correctamente. Para el MovieService, un punto crucial es poder buscar películas por género. Aquí es donde los tests cobran importancia:
Definición de la Prueba: Creamos un test para MovieService y decidimos qué resultados esperamos, como retornar solo las películas de un género específico, por ejemplo, comedia.
Uso de Mocks: Como el repositorio aún no tiene implementación, utilizamos Mockito para simularlo. Con Mockito, podemos indicar que cuando se llame al método findAll, retorne una lista predefinida de películas.
Verificación de Resultados: Comprobamos que al buscar películas de un género, solo se devuelvan las correctas usando métodos como filter en streams.
Aquí un fragmento del código de prueba para buscar películas por género):
// Simulando las películas retornadas por el repositoriowhen(repositorio.findAll()).thenReturn(Arrays.asList(newPelícula(1,"Comedia P1",90,Género.COMEDIA),newPelícula(2,"Drama P1",100,Género.DRAMA),newPelícula(3,"Comedia P2",95,Género.COMEDIA)));// Método en el servicio para filtrar por géneropublicList<Película>findMoviesByGenre(Género género){return repositorio.findAll().stream().filter(p -> p.getGénero().equals(género)).collect(Collectors.toList());}// Verificación en el testassertThat(movieService.findMoviesByGenre(Género.COMEDIA)).hasSize(2).extracting(Película::getId).contains(1,3);
¿Qué otros ejemplos de pruebas podemos implementar?
Ahora que ya pusimos a prueba el MovieService por género, otra funcionalidad similar que nos interesa es buscar por duración. Estas pruebas adicionales no solo mejoran la calidad del código, sino que también refuerzan la confianza en que nuestro sistema se comportará como se espera bajo diferentes condiciones.
Cada nuevo método que implementemos en MovieService debería ir acompañado de una o múltiples pruebas que validen sus resultados y comportamientos excepcionales. Esto no solo es una buena práctica, sino que se convierte en una herramienta esencial para la evolución continua y mantenimiento del software.
Tests de Aplicación de Películas: Filtrado por Género y Duración
Como opción a todos, para hacer los asserts a mi me gusta AssertJ, puedes concatenar muchas assertions, de muchos tipos, es interesante. Pueden agregarlo por maven al proyecto, y en esta página http://joel-costigliola.github.io/assertj/ está el ejemplo de las funcionalidades.
Hola Alex, claro que sí. EveryItem te ayuda a afirmar si todos los elementos de un array cumplen con una condición. Es muy util si quieres evaluar arrays o colecciones y evitar así crear objetos en memoria para realizar comparaciones. Por tal motivo, en el código afirmé que la prueba pasa si cada elemento de la lista tiene asignado como género comedia.
.
Puede ser porque ya ha sido Deprecated mira, tendrás que buscar una alternativa, no estoy muy familiarizado con Java pero seguro lo encuentras fácil con google.