Pruebas de Búsqueda de Películas por Duración en Java
Clase 18 de 24 • Curso Básico de Testing en Java
Resumen
¿Cómo se realiza una búsqueda de películas por duración en un test?
Al escribir pruebas para un servicio que busca películas por duración, es esencial tener un enfoque organizado y reutilizar código común. En nuestro ejemplo, nos enfocamos en crear un método que permite filtrar películas por la duración deseada. Esto lo hacemos reutilizando piezas de código existentes, garantizando que nuestros tests sean más manejables y claros. Vamos a ver paso a paso el proceso.
¿Cómo estructurar el setup del test?
Una práctica común en la escritura de tests es eliminar redundancias utilizando un setup, lo cual es perfecto para manejar tareas comunes y repetitivas. Esto se logra mediante el uso de anotaciones como @Before
, que nos permiten inicializar objetos o variables necesarios antes de ejecutar cada test. En nuestro caso, configuramos nuestro moviService
como un campo de la clase en lugar de una variable local para que todos los tests puedan acceder a él:
@Before
public void setup() {
// Creación del servicio de películas y otras configuraciones necesarias
}
¿Cómo implementar la lógica de búsqueda por duración?
Supongamos que queremos buscar todas las películas que duren menos de 120 minutos. Creamos una función en nuestro servicio de películas que aceptará como parámetro la duración máxima y retornará una lista de películas que cumplan el criterio:
public Collection<Movie> getMoviesByDuration(int maxDuration) {
return repository.getAllMovies().stream()
.filter(movie -> movie.getMinutes() <= maxDuration)
.collect(Collectors.toList());
}
¿Qué más optimizar en nuestro código de test?
Refactorizar y extraer métodos comunes puede hacer que nuestro código de pruebas sea más limpio y eficiente. Por ejemplo, si repetimos la lógica para transformar películas a sus IDs, podemos extraer esta lógica en un método separado:
private List<Integer> getMovieIDs(Collection<Movie> movies) {
return movies.stream()
.map(Movie::getId)
.collect(Collectors.toList());
}
¿Qué verificar en los tests una vez implementados?
Para asegurarse de que el test está verificando los valores esperados, podemos realizar la comparación de los IDs de las películas obtenidas con los IDs esperados. Por ejemplo, si esperamos que las películas que cumplen la condición sean las de IDs 2, 3, 4, 5 y 6, realizaríamos las siguientes verificaciones:
@Test
public void shouldReturnMoviesByDuration() {
Collection<Movie> result = moviService.getMoviesByDuration(119);
List<Integer> movieIds = getMovieIDs(result);
List<Integer> expectedMovieIds = Arrays.asList(2, 3, 4, 5, 6);
assertEquals(expectedMovieIds, movieIds);
}
La automatización y refactorización no solo mejora la legibilidad y eficiencia de los tests, sino que también proporciona tranquilidad a los desarrolladores, asegurando que los tests continúen pasando tras realizar cambios en el código. Esta metodología enriquece los procesos de validación y contribuye a un desarrollo más robusto.