Модуль управления студентами: юнит-тестирование

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь создавать юнит-тесты для модуля управления студентами с использованием JUnit 5 и Mockito. Проект включает в себя две основные задачи: создание тестов для класса StudentServiceImpl и создание тестов для класса StudentController.

🎯 Задачи

В этом проекте вы научитесь:

  • Создавать файл ServiceTests.java для тестирования класса StudentServiceImpl с использованием JUnit 5
  • Создавать файл ControllerTests.java для тестирования класса StudentController с использованием JUnit 5 и Mockito
  • Использовать функции тестирования Spring Boot, такие как @SpringBootTest и @MockBean, для загрузки необходимых компонентов и создания мок-объектов для тестирования
  • Писать тестовые случаи для проверки функциональности методов queryStudents(), insertStudent() и deleteStudent() в классе StudentServiceImpl
  • Писать тестовые случаи для проверки функциональности методов getStudents(), getStudent() и modifyStudent() в классе StudentController

🏆 Достижения

После завершения этого проекта вы сможете:

  • Настраивать юнит-тестирование для Spring Boot-приложения с использованием JUnit 5 и Mockito
  • Использовать функции тестирования Spring Boot для загрузки необходимых компонентов и создания мок-объектов для тестирования
  • Писать эффективные тестовые случаи для обеспечения правильности реализации сервисного и контроллерного слоев
  • Использовать утверждения для проверки ожидаемого поведения тестируемых методов

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java/DataStructuresGroup -.-> java/collections_methods("Collections Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/arraylist("ArrayList") subgraph Lab Skills java/collections_methods -.-> lab-300404{{"Модуль управления студентами: юнит-тестирование"}} java/arraylist -.-> lab-300404{{"Модуль управления студентами: юнит-тестирование"}} end

Создать файл ServiceTests.java

В этом шаге вы научитесь создавать файл ServiceTests.java для тестирования класса StudentServiceImpl с использованием JUnit 5.

  1. Откройте свой IDE и перейдите в директорию /test/java/org/labex/springboottesting в вашем проекте.
  2. Создайте новый Java-файл с именем ServiceTests.java.
  3. В файле ServiceTests.java добавьте следующий код:
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() {
        // Тестирование метода queryStudents() сервиса для обеспечения правильного извлечения данных.
        List<Student> result = service.queryStudents();

        // Проверка того, что размер возвращаемого списка соответствует ожидаемому размеру.
        assertEquals(3, result.size());
    }

    @Test
    void testInsertStudent() {
        // Создание образца объекта студента для вставки.
        Student student = new Student("1", "test", 18, "male");

        // Тестирование метода insertStudent() сервиса для обеспечения успешной вставки.
        Boolean result = service.insertStudent(student);

        // Проверка того, что операция вставки прошла успешно.
        assertTrue(result);
    }

    @Test
    void testDeleteStudent() {
        // Тестирование метода deleteStudent() сервиса для обеспечения успешного удаления.
        Boolean result = service.deleteStudent("20191001");

        // Проверка того, что операция удаления прошла успешно.
        assertTrue(result);
    }
}

Класс ServiceTests аннотирован @SpringBootTest(classes = StudentServiceImpl.class) для загрузки класса реализации StudentServiceImpl в тестовом классе. Класс содержит три тестовых метода:

  1. testQueryStudents(): Тестирует метод queryStudents() интерфейса IStudentService для обеспечения того, что возвращаемый список студентов имеет ожидаемый размер.
  2. testInsertStudent(): Тестирует метод insertStudent() интерфейса IStudentService для обеспечения успешности операции вставки студента.
  3. testDeleteStudent(): Тестирует метод deleteStudent() интерфейса IStudentService для обеспечения успешности операции удаления студента.
✨ Проверить решение и практиковаться

Создать файл ControllerTests.java

В этом шаге вы научитесь создавать файл ControllerTests.java для тестирования класса StudentController с использованием фреймворка тестирования Mockito.

  1. Откройте свой IDE и перейдите в директорию /test/java/org/labex/springboottesting в вашем проекте.
  2. Создайте новый Java-файл с именем ControllerTests.java.
  3. В файле ControllerTests.java добавьте следующий код:
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 // Загрузка контекста Spring Boot-приложения.
@EnableWebMvc // Включение функций Spring Web MVC.
@AutoConfigureMockMvc // Конфигурация экземпляра MockMvc.
class ControllerTests {

    @Autowired
    private MockMvc mockMvc; // Автовнедрение экземпляра MockMvc для имитации HTTP-запросов.

    private ObjectMapper objectMapper; // ObjectMapper для преобразования объектов в JSON и наоборот.

    @MockBean // Аннотация MockBean для создания мока для IStudentDAO.
    private IStudentDAO studentDAO;

    @BeforeEach
    void setUp() {
        // Инициализация ObjectMapper для преобразования объектов в JSON и наоборот.
        this.objectMapper = new ObjectMapper();
    }

    @Test
    void testGetStudents() throws Exception {
        // Создание образцов студентов.
        Student s1 = new Student("20191001", "John", 18, "Male");
        Student s2 = new Student("20191069", "Lily", 19, "Female");

        // Создание списка студентов и добавление в него образцов студентов.
        ArrayList<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);

        // Имитация поведения studentDAO для возврата списка студентов при вызове findStudentAll().
        when(studentDAO.findStudentAll()).thenReturn(list);

        // Выполнение GET-запроса для получения всех студентов и проверка ответа.
        this.mockMvc.perform(get("/api/v2/students")
                       .accept("application/json; charset=UTF-8")) // Установка заголовка accept для указания ожидаемого типа ответа.
               .andDo(print()) // Печать деталей запроса и ответа.
               .andExpect(status().isOk()) // Проверка того, что статус ответа равен OK (200).
               .andReturn(); // Возвращение объекта MvcResult для дальнейших проверок.
    }

    @Test
    void testGetStudent() throws Exception {
        // Создание образца студента.
        Student s1 = new Student("20191001", "John", 18, "Male");

        // Имитация поведения studentDAO для возврата образца студента при вызове findStudentById() с "20191001".
        when(studentDAO.findStudentById("20191001")).thenReturn(s1);

        // Выполнение GET-запроса для получения конкретного студента по ID и проверка ответа.
        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 {
        // Создание образца студента.
        Student s1 = new Student("20191001", "John", 18, "Male");

        // Преобразование образца студента в формат JSON.
        String content = objectMapper.writeValueAsString(s1);

        // Имитация поведения studentDAO для возврата true при вызове updateStudent() с любым объектом студента.
        when(studentDAO.updateStudent(any())).thenReturn(true);

        // Выполнение PUT-запроса для изменения студента и проверка ответа.
        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();
    }
}

Класс ControllerTests аннотирован @SpringBootTest для загрузки контекста Spring Boot-приложения, @EnableWebMvc для включения функций Spring Web MVC и @AutoConfigureMockMvc для настройки экземпляра MockMvc. Класс содержит три тестовых метода:

  1. testGetStudents(): Тестирует метод getStudents() класса StudentController, имитируя поведение интерфейса IStudentDAO и выполняя GET-запрос к конечной точке /api/v2/students.
  2. testGetStudent(): Тестирует метод getStudent() класса StudentController, имитируя поведение интерфейса IStudentDAO и выполняя GET-запрос к конечной точке /api/v2/student/20191001.
  3. testModifyStudent(): Тестирует метод modifyStudent() класса StudentController, имитируя поведение интерфейса IStudentDAO, преобразуя объект студента в JSON и выполняя PUT-запрос к конечной точке /api/v2/student.
✨ Проверить решение и практиковаться

Запустить тесты

Теперь, когда вы создали файлы ServiceTests.java и ControllerTests.java, вы можете запустить тесты, чтобы проверить функциональность классов StudentServiceImpl и StudentController.

  1. Откройте терминал или командную строку и перейдите в директорию вашего проекта с помощью следующей команды:
cd ~/project/springboottesting/
  1. Запустите следующую команду, чтобы выполнить класс ServiceTests:
mvn test -Dtest=ServiceTests

Это запустит три тестовых метода в классе ServiceTests и покажет результаты.

  1. Запустите следующую команду, чтобы выполнить класс ControllerTests:
mvn test -Dtest=ControllerTests

Это запустит три тестовых метода в классе ControllerTests и покажет результаты.

В консольном выводе вы должны увидеть результаты тестов, включая все пройденные или не пройденные тесты.

✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.