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 виконує наступні дії:
-
DelegatingSmartContextLoader
: Один із двох завантажувачів за замовчуванням, він внутрішньо делегує роботу завантажувачамAnnotationConfigContextLoader
,GenericXmlContextLoader
абоGenericGroovyXmlContext
, залежно або від конфігурації, оголошеної для тестового класу, або від наявності за замовчуванням або конфігураційних класів за умовчанням. Підтримка Groovy активується, лише якщо Groovy перебуває на шляху класів. -
WebDelegatingSmartContextLoader
: Один із двох завантажувачів за замовчуванням, він внутрішньо делегує роботу завантажувачамAnnotationConfigWebContextLoader
,GenericXmlWebContextLoader
абоGenericGroovyXml
залежно або від конфігурації, оголошеної для тестового класу, або від наявності за замовчуванням або конфігураційних класів за умовчанням. Вебзавантажувач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
,
доповнити стандартні набори реалізацій ContextCustomizer
та TestExecutionListener
тощо.
Для такого низькорівневого контролю над роботою фреймворку TestContext середовище Spring надає стратегію початкового
завантаження.
TestContextBootstrapper
визначає SPI-інтерфейс для завантаження фреймворку TestContext. TestContextBootstrapper
використовується TestContextManager
для завантаження реалізацій TestExecutionListener
для
поточного тесту та для побудови TestContext
, яким він керує. Ви можете налаштувати спеціальну стратегію
початкового завантаження для тестового класу (або ієрархії тестових класів) за допомогою зазначення анотації @BootstrapWith
або безпосередньо, або як мета-анотації. Якщо початковий завантажувач (bootstrapper ) не налаштований явно за
допомогою анотації @BootstrapWith
, використовується або DefaultTestContextBootstrapper,
або WebTestContextBootstrapper
, залежно від наявності анотації @WebAppConfiguration
.
Оскільки SPI-інтерфейс TestContextBootstrapper
, швидше за все, зміниться в майбутньому (щоб враховувати
нові вимоги), ми рекомендуємо розробникам не реалізовувати цей інтерфейс безпосередньо, а натомість розширити AbstractTestContextBootstrapper
або один із його конкретних підкласів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ