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 или один из его конкретных подклассов.