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

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

Ответ

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

Что она делает:

  1. Автоматически находит и загружает конфигурацию из класса, помеченного @SpringBootApplication.
  2. Создает ApplicationContext, идентичный контексту реального приложения.
  3. При необходимости запускает встроенный веб-сервер (Tomcat, Jetty, Netty).

Основные параметры:

  • webEnvironment: определяет тип веб-окружения.
    • WebEnvironment.NONE — без веб-сервера (тесты для сервисного слоя).
    • WebEnvironment.RANDOM_PORT — сервер запускается на случайном порту.
    • WebEnvironment.DEFINED_PORT — сервер использует порт из server.port (обычно 8080).

Пример теста с REST-запросом:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class UserControllerIntegrationTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    void getUser_ReturnsUser() {
        // Действие: Отправка HTTP-запроса
        ResponseEntity<UserDto> response = restTemplate
                .getForEntity("/api/users/1", UserDto.class);

        // Проверка:
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(response.getBody().getId()).isEqualTo(1);
    }
}

Когда использовать: Для сквозного (end-to-end) тестирования, когда нужен доступ ко всем бинам (сервисы, репозитории, контроллеры). Для тестирования отдельных слоев предпочтительнее использовать @WebMvcTest (MVC) или @DataJpaTest (JPA).