Spring TestContext Framework (находящийся в пакете org.springframework.test.context обеспечивает общую, управляемую аннотациями поддержку модульного и интеграционного тестирования, которая не зависит от используемой среды тестирования. В фреймворке TestContext также большее значение придается соглашению, а не конфигурации, при разумных значениях по умолчанию, которые можно менять с помощью конфигурации на основе аннотаций.

В дополнение к общей тестовой инфраструктуре, фреймворк TestContext обеспечивает явную поддержку JUnit 4, JUnit Jupiter (он же JUnit 5) и TestNG. Для JUnit 4 и TestNG Spring представлены abstract вспомогательные классы. Более того, Spring предоставляет специальный Runner из JUnit и специальные Rules из JUnit для JUnit 4 и специальное Extension для JUnit Jupiter, которые позволяют писать так называемые тестовые классы POJO. Тестовые классы POJO не обязательно расширяют определенную иерархию классов, например, абстрактные вспомогательные классы.

В следующем разделе кратко рассмотрены внутренние составляющие фреймворка TestContext. Если вас интересует только использование фреймворка и вам не нужно расширять его своими собственными специальными слушателями или загрузчиками, переходите непосредственно к разделам, посвященным конфигурации, (управление контекстом, внедрение зависимостей, управление транзакциями), вспомогательным классам и поддержке аннотаций.

См. упомянутые разделы в "Вспомогательные классы фреймворка TestContext".

Ключевые абстракции

Ядро фреймворка состоит из класса TestContextManager и интерфейсов TestContext, TestExecutionListener и SmartContextLoader. Интерфейс TestContextManager создается для каждого тестового класса (например, для выполнения всех тестовых методов в рамках одного тестового класса в JUnit Jupiter). Интерфейс TestContextManager, в свою очередь, управляет TestContext, который содержит контекст текущего теста. Интерфейс TestContextManager также обновляет состояние TestContext по мере выполнения теста и делегирует работу реализациям TestExecutionListener, которые инструментируют фактическое выполнение теста, обеспечивая внедрение зависимостей, управление транзакциями и так далее. Интерфейс SmartContextLoader отвечает за загрузку ApplicationContext для данного тестового класса. Дополнительную информацию и примеры различных реализаций см. в javadoc и тестовом комплекте Spring.

TestContext

Интерфейс TestContext инкапсулирует контекст, в котором выполняется тест (независимо от реально используемого тестового фреймворка), и обеспечивает управление контекстом, а также поддержку кэширования для экземпляра теста, за который он отвечает. Интерфейс TestContext также делегирует SmartContextLoader загрузку ApplicationContext по запросу.

TestContextManager

Интерфейс TestContextManager является основной точкой входа в Spring TestContext Framework и отвечает за управление одним TestContext и сигнализацию событий каждому зарегистрированному TestExecutionListener в четко определенных точках выполнения теста:

  • Перед любыми методами "перед классами" или "перед всеми" конкретного тестового фреймворка.

  • Постобработка тестового экземпляра.

  • Перед любыми методами "перед" или "перед каждым" конкретного тестового фреймворка.

  • Непосредственно перед выполнением тестового метода, но после настройки теста.

  • Непосредственно после выполнения тестового метода, но до разрушения теста.

  • После любых методов "после" или "после каждого" конкретного тестового фреймворка.

  • После любых методов "после класса" или "после всех" конкретного тестового фреймворка.

TestExecutionListener

Слушатель TestExecutionListener определяет API-интерфейс для реагирования на события выполнения теста, публикуемые TestContextManager, с которым зарегистрирован слушатель. См. Конфигурация TestExecutionListener.

Context Loaders

Контекстный загрузчик ContextLoader – это интерфейс стратегии для загрузки ApplicationContext для интеграционного теста, управляемого Spring TestContext Framework. Вам необходимо реализовать SmartContextLoader вместо этого интерфейса, чтобы обеспечить поддержку компонентных классов, профилей определения активных бинов, источников тестовых свойств, иерархий контекстов и поддержкуWebApplicationContext.

Загрузчик SmartContextLoader – это расширение интерфейса ContextLoader, которое заменяет оригинальный простой SPI-интерфейс ContextLoader. В частности, SmartContextLoader может выбрать обработку местоположений ресурсов, компонентных классов или инициализаторов контекста. Кроме того, SmartContextLoader может устанавливать активные профили определения бинов и источники тестовых свойств в загружаемом контексте.

Spring provides the following implementations:

  • DelegatingSmartContextLoader: Один из двух загрузчиков по умолчанию, он внутренне делегирует работу загрузчикам AnnotationConfigContextLoader, GenericXmlContextLoader или GenericGroovyXmlContextLoader, в зависимости либо от конфигурации, объявленной для тестового класса, либо от наличия местоположений по умолчанию или конфигурационных классов по умолчанию. Поддержка Groovy активируется, только если Groovy находится в пути классов.

  • WebDelegatingSmartContextLoader: Один из двух загрузчиков по умолчанию, он внутренне делегирует работу загрузчикам AnnotationConfigWebContextLoader, GenericXmlWebContextLoader или GenericGroovyXmlWebContextLoader в зависимости либо от конфигурации, объявленной для тестового класса, либо от наличия местоположений по умолчанию или конфигурационных классов по умолчанию. Веб-загрузчик ContextLoader используется только в том случае, если в тестовом классе присутствует аннотация @WebAppConfiguration. Поддержка Groovy активируется, только если Groovy находится в пути классов.

  • AnnotationConfigContextLoader: Загружает стандартный ApplicationContext из компонентных классов.

  • AnnotationConfigWebContextLoader: Загружает WebApplicationContext из компонентных классов.

  • GenericGroovyXmlContextLoader: Загружает стандартный ApplicationContext из ресурсов, которые представляют собой либо скрипты Groovy, либо конфигурационные XML-файлы.

  • GenericGroovyXmlWebContextLoader: Загружает WebApplicationContext из ресурсов, которые представляют собой либо скрипты Groovy, либо конфигурационные XML-файлы .

  • GenericXmlContextLoader: Загружает стандартный ApplicationContext из местоположений XML-ресурсов.

  • GenericXmlWebContextLoader: Загружает WebApplicationContext из местоположений XML-ресурсов.

Начальная загрузка фреймворка TestContext

Конфигурация по умолчанию для внутренних компонентов Spring TestContext Framework является достаточной для всех распространенных случаев использования. Однако бывают случаи, когда команде разработчиков или стороннему фреймворку нужно изменить стандартный ContextLoader, реализовать пользовательский TestContext или ContextCache, дополнить стандартные наборы реализаций ContextCustomizerFactory и TestExecutionListener и так далее. Для такого низкоуровневого контроля над работой фреймворка TestContext среда Spring предоставляет стратегию начальной загрузки.

TestContextBootstrapper определяет SPI-интерфейс для загрузки фреймворка TestContext. TestContextBootstrapper используется TestContextManager для загрузки реализаций TestExecutionListener для текущего теста и для построения TestContext, которым он управляет. Вы можете сконфигурировать специальную стратегию начальной загрузки для тестового класса (или иерархии тестовых классов) с помощью указания аннотации @BootstrapWith либо напрямую, либо как мета-аннотации. Если начальный загрузчик (bootstrapper ) не сконфигурирован явно с помощью аннотации @BootstrapWith, используется либо DefaultTestContextBootstrapper, либо WebTestContextBootstrapper, в зависимости от наличия аннотации @WebAppConfiguration.

Поскольку SPI-интерфейс TestContextBootstrapper, скорее всего, изменится в будущем (чтобы учитывать новые требования), мы настоятельно рекомендуем разработчикам не реализовывать этот интерфейс напрямую, а вместо этого расширить AbstractTestContextBootstrapper или один из его конкретных подклассов.