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