Создать файл 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
.