Что такое аннотация @SpringBootTest
Что проверяют
Понимаете ли вы цену интеграционного теста и умеете ли выбирать уровень проверки. Аннотацию называют почти все, а вот что именно она поднимает и почему набор тестов из-за неё разрастается по времени, объясняют немногие.
Как отвечать
@SpringBootTest поднимает настоящий контекст приложения для теста. Конфигурацию она ищет сама: идёт вверх по пакетам от тестового класса, пока не найдёт класс с @SpringBootConfiguration, то есть главный класс приложения.
Веб-часть задаётся параметром webEnvironment:
MOCKпо умолчанию: реальный сервер не стартует, запросы гоняют черезMockMvcвместе с@AutoConfigureMockMvc;RANDOM_PORTиDEFINED_PORTподнимают настоящий контейнер сервлетов, обращаться к нему нужно черезTestRestTemplateилиWebTestClient, порт берут из@LocalServerPort;NONEоставляет только контекст, без веб-слоя.
Ключевая вещь для сильного ответа это кэш контекстов. Spring кэширует контекст между тестовыми классами по ключу из конфигурации: профили, переопределённые свойства, подменённые бины. Каждый новый набор это новый старт контекста, поэтому свои свойства и свои подмены в каждом классе и разгоняют прогон.
Отдельно скажите про срезы: @WebMvcTest, @DataJpaTest, @JsonTest поднимают только нужный слой и стартуют заметно быстрее. Полный контекст берут тогда, когда проверяют связку целиком.
Где спотыкаются
Ждут, что при настройках по умолчанию поднимется веб-сервер, и не понимают, почему обращение по адресу не проходит. Без RANDOM_PORT сервера нет вовсе, есть только имитация слоя контроллеров.
Полагаются на откат транзакции, когда сервер поднят по-настоящему. Аннотация @Transactional на тесте откатывает то, что делал сам тест, а запрос по сети исполняется в другом потоке и своей транзакции, и записанные им данные остаются в базе.
Пишут на полном контексте весь набор, включая проверку одного маппера. Прогон разбухает, локально его перестают запускать, и падение приезжает уже из общей сборки, когда причина давно забыта.