Для чего используется аннотация @SpringBootTest и в каких сценариях?

«Для чего используется аннотация @SpringBootTest и в каких сценариях?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@SpringBootTest — это основная аннотация для интеграционного тестирования Spring Boot приложений. Она загружает полный контекст приложения, имитируя его реальный запуск.

Основное назначение:

  • Тестирование взаимодействия нескольких компонентов (сервисов, репозиториев).
  • Тестирование с доступом к реальной или in-memory базе данных.
  • Тестирование REST API с поднятым embedded-сервером.

Пример базового теста:

@SpringBootTest
class UserServiceIntegrationTest {
    @Autowired
    private UserService userService;

    @Test
    void shouldCreateAndFindUser() {
        User newUser = userService.create("test@email.com");
        User foundUser = userService.findById(newUser.getId());

        assertThat(foundUser.getEmail()).isEqualTo("test@email.com");
    }
}

Настройка окружения:

@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT // Запуск на случайном порту
)
class MyControllerTest {
    @LocalServerPort
    private int port;

    @Test
    void testEndpoint() {
        // Тестирование через TestRestTemplate или WebTestClient
    }
}
Сравнение с другими аннотациями: Аннотация Назначение Контекст Скорость
@SpringBootTest Полная интеграция Полный контекст Медленно
@WebMvcTest Тестирование MVC-слоя Только веб-слой Быстро
@DataJpaTest Тестирование JPA Только JPA и БД Быстро
@JsonTest Тестирование JSON Только Jackson Очень быстро

Рекомендации:

  1. Используйте @SpringBootTest для сквозных (end-to-end) тестов.
  2. Для изолированных unit-тестов предпочитайте @WebMvcTest, @DataJpaTest или обычные тесты без Spring.
  3. Используйте @MockBean для замены тяжелых зависимостей (например, внешних сервисов).
  4. Настройте @TestConfiguration для предоставления тестовых бинов.