Сколько контекстов Spring Boot создается для двух тестовых классов с аннотацией @SpringBootTest?

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

Ответ

Поведение зависит от конфигурации тестов и оптимизаций Spring.

  • По умолчанию: Каждый тестовый класс с @SpringBootTest запускает загрузку своего собственного ApplicationContext. Это может быть неэффективно.
  • Кэширование контекста: Spring Test кэширует и переиспользует контексты между тестами, если их конфигурация идентична. Конфигурация определяется параметрами аннотации: classes, properties, webEnvironment и другими атрибутами @SpringBootTest.

Пример:

// Конфигурация идентична -> Spring, скорее всего, создаст и переиспользует ОДИН контекст
@SpringBootTest
class UserServiceTest { /* ... */ }

@SpringBootTest
class OrderServiceTest { /* ... */ }

// Разная конфигурация -> будут созданы ДВА разных контекста
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class WebControllerTest { /* ... */ }

Управление кэшированием: Чтобы гарантированно создать новый контекст для каждого тестового класса (например, для изоляции), используйте аннотацию @DirtiesContext.

@SpringBootTest
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
class IsolatedTest { /* Контекст будет закрыт после этого класса */ }