Введение
В этом проекте вы научитесь создавать юнит-тесты для модуля управления студентами с использованием 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 для загрузки необходимых компонентов и создания мок-объектов для тестирования
- Писать эффективные тестовые случаи для обеспечения правильности реализации сервисного и контроллерного слоев
- Использовать утверждения для проверки ожидаемого поведения тестируемых методов
Создать файл ServiceTests.java
В этом шаге вы научитесь создавать файл ServiceTests.java для тестирования класса StudentServiceImpl с использованием JUnit 5.
- Откройте свой IDE и перейдите в директорию
/test/java/org/labex/springboottestingв вашем проекте. - Создайте новый Java-файл с именем
ServiceTests.java. - В файле
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 в тестовом классе. Класс содержит три тестовых метода:
testQueryStudents(): Тестирует методqueryStudents()интерфейсаIStudentServiceдля обеспечения того, что возвращаемый список студентов имеет ожидаемый размер.testInsertStudent(): Тестирует методinsertStudent()интерфейсаIStudentServiceдля обеспечения успешности операции вставки студента.testDeleteStudent(): Тестирует методdeleteStudent()интерфейсаIStudentServiceдля обеспечения успешности операции удаления студента.
Создать файл ControllerTests.java
В этом шаге вы научитесь создавать файл ControllerTests.java для тестирования класса StudentController с использованием фреймворка тестирования Mockito.
- Откройте свой IDE и перейдите в директорию
/test/java/org/labex/springboottestingв вашем проекте. - Создайте новый Java-файл с именем
ControllerTests.java. - В файле
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. Класс содержит три тестовых метода:
testGetStudents(): Тестирует методgetStudents()классаStudentController, имитируя поведение интерфейсаIStudentDAOи выполняя GET-запрос к конечной точке/api/v2/students.testGetStudent(): Тестирует методgetStudent()классаStudentController, имитируя поведение интерфейсаIStudentDAOи выполняя GET-запрос к конечной точке/api/v2/student/20191001.testModifyStudent(): Тестирует методmodifyStudent()классаStudentController, имитируя поведение интерфейсаIStudentDAO, преобразуя объект студента в JSON и выполняя PUT-запрос к конечной точке/api/v2/student.
Запустить тесты
Теперь, когда вы создали файлы ServiceTests.java и ControllerTests.java, вы можете запустить тесты, чтобы проверить функциональность классов StudentServiceImpl и StudentController.
- Откройте терминал или командную строку и перейдите в директорию вашего проекта с помощью следующей команды:
cd ~/project/springboottesting/
- Запустите следующую команду, чтобы выполнить класс
ServiceTests:
mvn test -Dtest=ServiceTests
Это запустит три тестовых метода в классе ServiceTests и покажет результаты.
- Запустите следующую команду, чтобы выполнить класс
ControllerTests:
mvn test -Dtest=ControllerTests
Это запустит три тестовых метода в классе ControllerTests и покажет результаты.
В консольном выводе вы должны увидеть результаты тестов, включая все пройденные или не пройденные тесты.
Резюме
Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.



