Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.
@bookjava
Фото 🧪 Тестирование в Spring Boot: Спите спокойно Глобально тесты делятся на два лагеря: 1. Unit-тесты (Модульные): Быстрые, изолированные. Проверяем только логику одного класса (обычно Service). Никаких баз данных и поднятия Spring Context. 2. Integration-тесты (Интеграционные): Проверяем, как компоненты работают вместе (Controller + Service + DB). Здесь поднимается Spring Context. ⚡ 1. Unit-тесты: Изоляция и Скорость Когда вы тестируете UserService, вам не нужно, чтобы он реально лез в базу данных. Вам нужно проверить: "Если репозиторий вернет null, выбросит ли сервис ошибку?" Для этого мы используем Mockito - библиотеку, которая создает "фейковые" объекты (моки). Ключевые аннотации: 🔴 @ExtendWith(MockitoExtension.class) - включаем Mockito. 🔴 @Mock - "Создай фейковый объект" (например, UserRepository). 🔴 @InjectMocks - "Создай тестируемый объект (UserService) и вставь в него моки". 💻 Пример Unit-теста: @ExtendWith(MockitoExtension.class) // 1. Включаем Mockito class UserServiceTest { @Mock private UserRepository userRepository; // Фейк @InjectMocks private UserService userService; // Реальный сервис с фейком внутри @Test void shouldReturnUser_WhenExists() { // GIVEN (Дано) - Настраиваем поведение мока User mockUser = new User("Alex"); // "Если кто-то вызовет findById(1), верни mockUser" Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser)); // WHEN (Когда) - Вызываем метод сервиса User result = userService.findById(1L); // THEN (Тогда) - Проверяем результат Assertions.assertEquals("Alex", result.getName()); // Проверяем, что метод репозитория действительно вызывался 1 раз Mockito.verify(userRepository, times(1)).findById(1L); } } 🐢 2. Integration-тесты: Тяжелая артиллерия Иногда нужно проверить, правильно ли мапится JSON в контроллере или работает ли SQL-запрос. Тут нам нужен Spring Context. Ключевые аннотации: 🔴 @SpringBootTest - Поднимает весь контекст приложения (тяжело и медленно, но честно). 🔴 @WebMvcTest - Поднимает только веб-слой (Контроллеры). Сервисы и БД не грузятся. 🔴 @MockBean - Главная магия Spring Test. Это как @Mock, только этот мок кладется прямо в Spring Context, заменяя собой настоящий бин. 💻 Пример теста Контроллера (@WebMvcTest): @WebMvcTest(UserController.class) // Грузим только контроллер class UserControllerTest { @Autowired private MockMvc mockMvc; // Инструмент для имитации HTTP-запросов @MockBean // Заменяем настоящий сервис заглушкой в контексте Spring private UserService userService; @Test void shouldReturnStatus200() throws Exception { Mockito.when(userService.findById(1L)).thenReturn(new User("Alex")); mockMvc.perform(get("/users/1")) // Делаем GET запрос .andExpect(status().isOk()) // Ждем 200 OK .andExpect(jsonPath("$.name").value("Alex")); // Проверяем JSON } } ⚔️ @Mock vs @MockBean - Не путать! Это самый частый вопрос. 1. @Mock (из org.mockito): Используется в Unit-тестах. Быстро. Spring про него ничего не знает. 2. @MockBean (из spring-boot-test): Используется в Integration-тестах. Spring находит этот бин в контексте и подменяет его на мок. Медленнее. 🔥 Итог 🔴 Пишите много Unit-тестов (они быстрые). Используйте Mockito.when(...). 🔴 Пишите немного Integration-тестов (они проверяют связки). Используйте MockMvc. 🔴 Никогда не тестируйте внешней API или боевую БД - мокайте их! #SpringBoot #Testing #JUnit5 #Mockito #QualityAssurance 👉 @BookJava
Если у вас установлено приложение,
вы можете сразу перейти в канал