Вопрос с собеседования · Spring
Как писать тесты в Spring Boot — @SpringBootTest и тестовые срезы?
JuniorТестирование Spring Boot
Ещё спрашивают так:
- Чем @SpringBootTest отличается от @WebMvcTest?
- Что такое @MockitoBean?
Коротко
@SpringBootTest поднимает весь контекст приложения — для интеграционных тестов, медленно. Срезы поднимают только нужный слой: @WebMvcTest — контроллеры с MockMvc, @DataJpaTest — репозитории с базой, @JsonTest — сериализация. Зависимости слоя подменяют @MockitoBean (раньше @MockBean). Бизнес-логику лучше тестировать обычными модульными тестами без Spring — они быстрее всего. Настоящую базу в тестах даёт Testcontainers.
- Срез быстрее полного контекста в разы
- Контекст кэшируется между тестами с одинаковой конфигурацией — лишние @MockitoBean ломают кэш
- Тестовые настройки — application-test.yml и @ActiveProfiles("test")
А ещё Пирамида: много модульных, меньше срезов, немного полных интеграционных
Подробно
@WebMvcTest(OrderController.class)
class OrderControllerTest {
@Autowired MockMvc mvc;
@MockitoBean OrderService service;
@Test
void returns404WhenNotFound() throws Exception {
when(service.find(1L)).thenReturn(Optional.empty());
mvc.perform(get("/orders/1")).andExpect(status().isNotFound());
}
}
@DataJpaTest
class OrderRepositoryTest { /* тесты запросов */ }Что хотят услышать
- @SpringBootTest против срезов.
- @MockitoBean для зависимостей.
- Модульные тесты без Spring.
- Testcontainers для базы.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗@WebMvcTest поднимает весь контекст вместе с базой, но без встроенного веб-сервера
- ✗Срезы медленнее полного контекста, поэтому их используют только для отладки
- ✗Срезы поднимают весь контекст, как @SpringBootTest, но автоматически подменяют все бины моками
- ✓@SpringBootTest — весь контекст, а срезы (@WebMvcTest, @DataJpaTest) — только нужный слой
Связанные вопросы
Партнёр платформы
Разбор собеседования
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.