Библиотека Java разработчика
10.5K subscribers
1.17K photos
594 videos
58 files
1.5K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
Дмитрий Тучс — 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
👍3
🧪 Тестирование в 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

📲 Мы в MAX

👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5