Pruebas de Búsqueda de Películas por Duración en Java
Clase 18 de 24 • Curso Básico de Testing en Java
Contenido del curso
- 3

Uso de IntelliJ IDEA para Escribir y Probar Código Java
10:00 - 4

Creación de Tests Unitarios y Excepciones en Java
06:05 - 5

Escribir Tests en Java con JUnit: Instalación y Uso Básico
05:50 - 6

Organización de Tests en Funciones Separadas
04:28 - 7

Testing en Java con JUnit para Verificar Contraseñas
00:15 - 8

Simulación de Clases en Java con Moquito
11:05 - 9

Simulación de Pasarelas de Pago con Mockito
08:30 - 10

Organización y Mejora de Tests en jUnit
04:02 - 11
Función `isEmpty` y pruebas con JUnit en Java
00:34
- 16

Organización de Aplicaciones en Capas: Interfaz, Negocio y Datos
01:15 - 17

Tests de Aplicación de Películas: Filtrado por Género y Duración
11:43 - 18

Pruebas de Búsqueda de Películas por Duración en Java
06:11 - 19

Implementación de MovieRepository con JDBC en Java
13:33 - 20

Tests de JDBC: Búsqueda e Inserción de Películas por ID
10:08 - 21
Búsqueda de Películas por Nombre y Director en App
00:59
¿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.