Introducción
En este proyecto, aprenderá a crear pruebas unitarias para un Módulo de Gestión de Estudiantes utilizando JUnit 5 y Mockito. El proyecto incluye dos tareas principales: crear pruebas para la clase StudentServiceImpl y crear pruebas para la clase StudentController.
🎯 Tareas
En este proyecto, aprenderá:
- Cómo crear un archivo
ServiceTests.javapara probar la claseStudentServiceImplutilizando JUnit 5 - Cómo crear un archivo
ControllerTests.javapara probar la claseStudentControllerutilizando JUnit 5 y Mockito - Cómo utilizar las características de prueba de Spring Boot, como
@SpringBootTesty@MockBean, para cargar los componentes necesarios y crear mocks para las pruebas - Cómo escribir casos de prueba para verificar la funcionalidad de los métodos
queryStudents(),insertStudent()ydeleteStudent()en la claseStudentServiceImpl - Cómo escribir casos de prueba para verificar la funcionalidad de los métodos
getStudents(),getStudent()ymodifyStudent()en la claseStudentController
🏆 Logros
Después de completar este proyecto, podrá:
- Configurar la prueba unitaria para una aplicación de Spring Boot utilizando JUnit 5 y Mockito
- Utilizar las características de prueba de Spring Boot para cargar los componentes necesarios y crear mocks para las pruebas
- Escribir casos de prueba efectivos para garantizar la corrección de las implementaciones de la capa de servicio y controlador
- Utilizar aserciones para verificar el comportamiento esperado de los métodos probados
Crear el archivo ServiceTests.java
En este paso, aprenderá a crear el archivo ServiceTests.java para probar la clase StudentServiceImpl utilizando JUnit 5.
- Abra su IDE y vaya al directorio
/test/java/org/labex/springboottestingde su proyecto. - Cree un nuevo archivo Java llamado
ServiceTests.java. - En el archivo
ServiceTests.java, agregue el siguiente código:
package org.labex.springboottesting;
import org.junit.jupiter.api.Test;
import org.labex.springboottesting.service.StudentServiceImpl;
import org.labex.springboottesting.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@SpringBootTest(classes = StudentServiceImpl.class)
class ServiceTests {
@Autowired
private StudentServiceImpl service;
@Test
void testQueryStudents() {
// Probando el método queryStudents() del servicio para asegurar la recuperación correcta de datos.
List<Student> result = service.queryStudents();
// Asegurándose de que el tamaño de la lista devuelta coincida con el tamaño esperado.
assertEquals(3, result.size());
}
@Test
void testInsertStudent() {
// Creando un objeto de estudiante de muestra para insertar.
Student student = new Student("1", "test", 18, "male");
// Probando el método insertStudent() del servicio para asegurar una inserción exitosa.
Boolean result = service.insertStudent(student);
// Asegurándose de que la operación de inserción fue exitosa.
assertTrue(result);
}
@Test
void testDeleteStudent() {
// Probando el método deleteStudent() del servicio para asegurar una eliminación exitosa.
Boolean result = service.deleteStudent("20191001");
// Asegurándose de que la operación de eliminación fue exitosa.
assertTrue(result);
}
}
La clase ServiceTests está anotada con @SpringBootTest(classes = StudentServiceImpl.class) para cargar la clase de implementación StudentServiceImpl en la clase de prueba. La clase contiene tres métodos de prueba:
testQueryStudents(): Prueba el métodoqueryStudents()de la interfazIStudentServicepara asegurar que la lista de estudiantes devuelta tenga el tamaño esperado.testInsertStudent(): Prueba el métodoinsertStudent()de la interfazIStudentServicepara asegurar que la operación de inserción de estudiante sea exitosa.testDeleteStudent(): Prueba el métododeleteStudent()de la interfazIStudentServicepara asegurar que la operación de eliminación de estudiante sea exitosa.
Crear el archivo ControllerTests.java
En este paso, aprenderá a crear el archivo ControllerTests.java para probar la clase StudentController utilizando el marco de pruebas Mockito.
- Abra su IDE y vaya al directorio
/test/java/org/labex/springboottestingde su proyecto. - Cree un nuevo archivo Java llamado
ControllerTests.java. - En el archivo
ControllerTests.java, agregue el siguiente código:
package org.labex.springboottesting;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.labex.springboottesting.dao.IStudentDAO;
import org.labex.springboottesting.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import java.util.ArrayList;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest // Cargando el contexto de la aplicación de Spring Boot.
@EnableWebMvc // Habilita las características de Spring Web MVC.
@AutoConfigureMockMvc // Configura la instancia de MockMvc.
class ControllerTests {
@Autowired
private MockMvc mockMvc; // Inyecta automáticamente la instancia de MockMvc para simular solicitudes HTTP.
private ObjectMapper objectMapper; // ObjectMapper para la conversión JSON.
@MockBean // Anotación MockBean para crear un mock de IStudentDAO.
private IStudentDAO studentDAO;
@BeforeEach
void setUp() {
// Inicializando ObjectMapper para convertir objetos a JSON y viceversa.
this.objectMapper = new ObjectMapper();
}
@Test
void testGetStudents() throws Exception {
// Creando estudiantes de muestra.
Student s1 = new Student("20191001", "John", 18, "Male");
Student s2 = new Student("20191069", "Lily", 19, "Female");
// Creando una lista de estudiantes y agregando los estudiantes de muestra a ella.
ArrayList<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
// Simulando el comportamiento de studentDAO para devolver la lista de estudiantes cuando se llama a findStudentAll().
when(studentDAO.findStudentAll()).thenReturn(list);
// Realizando una solicitud GET para recuperar todos los estudiantes y validando la respuesta.
this.mockMvc.perform(get("/api/v2/students")
.accept("application/json; charset=UTF-8")) // Establece el encabezado de aceptación para especificar el tipo de respuesta esperado.
.andDo(print()) // Imprime los detalles de la solicitud y la respuesta.
.andExpect(status().isOk()) // Verifica que el estado de la respuesta sea OK (200).
.andReturn(); // Devuelve el objeto MvcResult para futuras aserciones.
}
@Test
void testGetStudent() throws Exception {
// Creando un estudiante de muestra.
Student s1 = new Student("20191001", "John", 18, "Male");
// Simulando el comportamiento de studentDAO para devolver el estudiante de muestra cuando se llama a findStudentById() con "20191001".
when(studentDAO.findStudentById("20191001")).thenReturn(s1);
// Realizando una solicitud GET para recuperar un estudiante específico por ID y validando la respuesta.
this.mockMvc.perform(get("/api/v2/student/20191001")
.accept("application/json; charset=UTF-8"))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
}
@Test
void testModifyStudent() throws Exception {
// Creando un estudiante de muestra.
Student s1 = new Student("20191001", "John", 18, "Male");
// Convirtiendo el estudiante de muestra a formato JSON.
String content = objectMapper.writeValueAsString(s1);
// Simulando el comportamiento de studentDAO para devolver true cuando se llama a updateStudent() con cualquier objeto de estudiante.
when(studentDAO.updateStudent(any())).thenReturn(true);
// Realizando una solicitud PUT para modificar un estudiante y validando la respuesta.
this.mockMvc.perform(put("/api/v2/student")
.content(content)
.contentType(MediaType.APPLICATION_JSON)
.accept("application/json; charset=UTF-8"))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
}
}
La clase ControllerTests está anotada con @SpringBootTest para cargar el contexto de la aplicación de Spring Boot, @EnableWebMvc para habilitar las características de Spring Web MVC y @AutoConfigureMockMvc para configurar la instancia de MockMvc. La clase contiene tres métodos de prueba:
testGetStudents(): Prueba el métodogetStudents()de la claseStudentControllersimulando el comportamiento de la interfazIStudentDAOy realizando una solicitud GET al punto final/api/v2/students.testGetStudent(): Prueba el métodogetStudent()de la claseStudentControllersimulando el comportamiento de la interfazIStudentDAOy realizando una solicitud GET al punto final/api/v2/student/20191001.testModifyStudent(): Prueba el métodomodifyStudent()de la claseStudentControllersimulando el comportamiento de la interfazIStudentDAO, convirtiendo un objeto de estudiante de muestra a JSON y realizando una solicitud PUT al punto final/api/v2/student.
Ejecutar las pruebas
Ahora que ha creado los archivos ServiceTests.java y ControllerTests.java, puede ejecutar las pruebas para verificar la funcionalidad de las clases StudentServiceImpl y StudentController.
- Abra una terminal o un símbolo del sistema y vaya al directorio de su proyecto utilizando el siguiente comando:
cd ~/project/springboottesting/
- Ejecute el siguiente comando para ejecutar la clase
ServiceTests:
mvn test -Dtest=ServiceTests
Esto ejecutará los tres métodos de prueba en la clase ServiceTests y mostrará los resultados.
- Ejecute el siguiente comando para ejecutar la clase
ControllerTests:
mvn test -Dtest=ControllerTests
Esto ejecutará los tres métodos de prueba en la clase ControllerTests y mostrará los resultados.
Debería ver los resultados de las pruebas, incluyendo cualquier prueba que pase o falle, en la salida de la consola.
Resumen
¡Felicidades! Has completado este proyecto. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.



