Дмитрий Тучс — The art of JUnit extensions
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную инфраструктуру для работы с тестовыми данными, авторизацией и другим, используя JUnit Extensions. Только практические навыки, которые будут полезны большинству автоматизаторов на Java.
https://www.youtube.com/watch?v=NFHdzKcU5OU
👉@BookJava
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную инфраструктуру для работы с тестовыми данными, авторизацией и другим, используя JUnit Extensions. Только практические навыки, которые будут полезны большинству автоматизаторов на Java.
https://www.youtube.com/watch?v=NFHdzKcU5OU
👉@BookJava
YouTube
Дмитрий Тучс — The art of JUnit extensions
Ближайшая конференция — Heisenbug 2025 Autumn, 19—20 октября, Санкт-Петербург + online. Подробности и билеты: https://jrg.su/D6uGC9
— —
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную…
— —
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную…
👍3
🧪 Тестирование в Spring Boot: Спите спокойно
Глобально тесты делятся на два лагеря:
1. Unit-тесты (Модульные): Быстрые, изолированные. Проверяем только логику одного класса (обычно Service). Никаких баз данных и поднятия Spring Context.
2. Integration-тесты (Интеграционные): Проверяем, как компоненты работают вместе (Controller + Service + DB). Здесь поднимается Spring Context.
⚡ 1. Unit-тесты: Изоляция и Скорость
Когда вы тестируете
Для этого мы используем Mockito - библиотеку, которая создает "фейковые" объекты (моки).
Ключевые аннотации:
🔴
🔴
🔴
💻 Пример Unit-теста:
🐢 2. Integration-тесты: Тяжелая артиллерия
Иногда нужно проверить, правильно ли мапится JSON в контроллере или работает ли SQL-запрос. Тут нам нужен Spring Context.
Ключевые аннотации:
🔴
🔴
🔴
💻 Пример теста Контроллера (
⚔️
Это самый частый вопрос.
1.
2.
🔥 Итог
🔴 Пишите много Unit-тестов (они быстрые). Используйте
🔴 Пишите немного Integration-тестов (они проверяют связки). Используйте
🔴 Никогда не тестируйте внешней API или боевую БД - мокайте их!
#SpringBoot #Testing #JUnit5 #Mockito #QualityAssurance
📲 Мы в MAX
👉@BookJava
Глобально тесты делятся на два лагеря:
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 находит этот бин в контексте и подменяет его на мок. Медленнее.🔥 Итог
Mockito.when(...).MockMvc.#SpringBoot #Testing #JUnit5 #Mockito #QualityAssurance
📲 Мы в MAX
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5