Pruebas unitarias del módulo de gestión de estudiantes

JavaBeginner
Practicar Ahora

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.java para probar la clase StudentServiceImpl utilizando JUnit 5
  • Cómo crear un archivo ControllerTests.java para probar la clase StudentController utilizando JUnit 5 y Mockito
  • Cómo utilizar las características de prueba de Spring Boot, como @SpringBootTest y @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() y deleteStudent() en la clase StudentServiceImpl
  • Cómo escribir casos de prueba para verificar la funcionalidad de los métodos getStudents(), getStudent() y modifyStudent() en la clase StudentController

🏆 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.

  1. Abra su IDE y vaya al directorio /test/java/org/labex/springboottesting de su proyecto.
  2. Cree un nuevo archivo Java llamado ServiceTests.java.
  3. 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:

  1. testQueryStudents(): Prueba el método queryStudents() de la interfaz IStudentService para asegurar que la lista de estudiantes devuelta tenga el tamaño esperado.
  2. testInsertStudent(): Prueba el método insertStudent() de la interfaz IStudentService para asegurar que la operación de inserción de estudiante sea exitosa.
  3. testDeleteStudent(): Prueba el método deleteStudent() de la interfaz IStudentService para asegurar que la operación de eliminación de estudiante sea exitosa.
✨ Revisar Solución y Practicar

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.

  1. Abra su IDE y vaya al directorio /test/java/org/labex/springboottesting de su proyecto.
  2. Cree un nuevo archivo Java llamado ControllerTests.java.
  3. 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:

  1. 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.
  2. 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.
  3. 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.
✨ Revisar Solución y Practicar

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.

  1. Abra una terminal o un símbolo del sistema y vaya al directorio de su proyecto utilizando el siguiente comando:
cd ~/project/springboottesting/
  1. 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.

  1. 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.

✨ Revisar Solución y Practicar

Resumen

¡Felicidades! Has completado este proyecto. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.