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/springboottesting de 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étodo getStudents() de la clase StudentController simulando el comportamiento de la interfaz IStudentDAO y realizando una solicitud GET al punto final /api/v2/students.
testGetStudent(): Prueba el método getStudent() de la clase StudentController simulando el comportamiento de la interfaz IStudentDAO y realizando una solicitud GET al punto final /api/v2/student/20191001.
testModifyStudent(): Prueba el método modifyStudent() de la clase StudentController simulando el comportamiento de la interfaz IStudentDAO, convirtiendo un objeto de estudiante de muestra a JSON y realizando una solicitud PUT al punto final /api/v2/student.