Наступні анотації підтримуються при використанні в поєднанні з SpringExtension та JUnit Jupiter (тобто моделлю програмування в JUnit 5):

@SpringJUnitConfig

@SpringJUnitConfig — це складова анотація, яка об'єднує @ExtendWith(SpringExtension.class) з JUnit Jupiter з @ContextConfiguration зі Spring TestContext Framework. Її можна використовувати на рівні класу як заміну @ContextConfiguration. Що стосується параметрів конфігурації, єдина різниця між анотаціями @ContextConfiguration та @SpringJUnitConfig полягає в тому, що в анотації @SpringJUnitConfig класи компонентів можуть бути оголошені з атрибутом value.

У цьому прикладі показано, як використовувати анотацію @SpringJUnitConfig для зазначення конфігураційного класу:

Java

@SpringJUnitConfig(TestConfig.class) 
class ConfigurationClassJUnitJupiterSpringTests {
    // тіло класу...
}}
  1. Зазначаємо клас конфігурації.
Kotlin

@SpringJUnitConfig(TestConfig::class) 
class ConfigurationClassJUnitJupiterSpringTests {
    // тіло класу...
}
  1. Зазначаємо клас конфігурації.

У наступному прикладі показано, як використовувати анотацію @SpringJUnitConfig для розташування конфігураційного файлу:

Java

@SpringJUnitConfig(locations = "/test-config.xml") 
class XmlJUnitJupiterSpringTests {
    // тіло класу...
}
  1. Зазначаємо розташування конфігураційного файлу.
Kotlin

@SpringJUnitConfig(locations = ["/test-config.xml"]) 
class XmlJUnitJupiterSpringTests {
    // тіло класу...
}
  1. Зазначаємо розташування конфігураційного файлу.

Детальнішу інформацію див. у розділі "Керування контекстом", а також у javadoc за @SpringJUnitConfig та @ContextConfiguration.

@SpringJUnitWebConfig

@SpringJUnitWebConfig — це складова анотація, яка об'єднує анотацію @ExtendWith(SpringExtension.class) із JUnit Jupiter з анотаціями @ContextConfiguration та @WebAppConfiguration із Spring TestContext Framework. Її можна використовувати на рівні класу як заміну анотацій @ContextConfiguration та @WebAppConfiguration. Що стосується параметрів конфігурації, єдина різниця між анотаціями @ContextConfiguration та @SpringJUnitWebConfig полягає в тому, що в анотації @SpringJUnitWebConfig компонентні класи можуть бути оголошені з використанням атрибуту value. До того ж, перевизначити атрибут value з анотації @WebAppConfiguration можна виключно за допомогою атрибуту resourcePath в анотації @SpringJUnitWebConfig.

У цьому прикладі показано, як використовувати анотацію @SpringJUnitWebConfig для зазначення конфігураційного класу:

Java

@SpringJUnitWebConfig(TestConfig.class) 
class ConfigurationClassJUnitJupiterSpringWebTests {
    // тіло класу...
} }
  1. Зазначаємо клас конфігурації.
Kotlin

@SpringJUnitWebConfig(TestConfig::class) 
class ConfigurationClassJUnitJupiterSpringWebTests {
    // тіло класу...
}
  1. Зазначаємо клас конфігурації.

У наступному прикладі показано, як використовувати анотацію @SpringJUnitWebConfig для зазначення розташування файлу конфігурації:

Java

@SpringJUnitWebConfig(locations = "/test-config.xml") 
class XmlJUnitJupiterSpringWebTests {
    // тіло класу...
}
  1. Зазначаємо розташування конфігураційного файлу.
Kotlin

@SpringJUnitWebConfig(locations = ["/test-config.xml"]) 
class XmlJUnitJupiterSpringWebTests {
    // тіло класу...
}
  1. Зазначаємо розташування конфігураційного файлу.

Детальнішу інформацію див. у розділі "Керування контекстом", а також у javadoc по @SpringJUnitWebConfig, @ContextConfiguration та @WebAppConfiguration.

@TestConstructor

@TestConstructor — це анотація рівня типу, яка використовується для налаштування того, як параметри конструктора тестового класу будуть автоматично визначені та пов'язані з компонентів у ApplicationContext тесту.

Якщо анотація @TestConstructor не присутня або присутня через мета-анотацію у тестовому класі, буде використовуватися режим автоматичного виявлення та зв'язування тестового конструктора за замовчуванням. Докладніше про те, як змінити режим за замовчуванням, див. нижче. Зверни увагу, що локальне оголошення анотації @Autowired для конструктора має пріоритет над анотацією @TestConstructor та режимом за замовчуванням.

Зміна режиму автоматичного виявлення та зв'язування тестового конструктора за замовчуванням

Режим автоматичного виявлення та зв'язування тестового конструктора за замовчуванням можна змінити, встановивши системну властивість spring.test.constructor.autowire.mode з JVM на значення all. До того ж, режим за замовчуванням можна встановити через механізм SpringProperties.

Починаючи з Spring Framework 5.3, режим за замовчуванням також може бути налаштований як параметр конфігурації JUnit Platform.

Якщо властивість spring.test.constructor.autowire.mode не встановлена, конструктори тестових класів не будуть автоматично виявлятися і зв'язуватися.

Починаючи зі Spring Framework 5.2, анотація @TestConstructor підтримується тільки у поєднанні з SpringExtension для використання з JUnit Jupiter. Зверни увагу, що SpringExtension часто реєструється автоматично: наприклад, при використанні анотацій @SpringJUnitConfig та @SpringJUnitWebConfig або різних пов'язаних із тестуванням анотацій із Spring Boot Test.

@NestedTestConfiguration

@NestedTestConfiguration — це анотація на рівні типів, яка використовується для налаштування того, яким чином тестові конфігураційні анотації в Spring обробляються всередині ієрархії класів для внутрішніх тестових класів. Якщо анотация @NestedTestConfiguration не присутсня або присутня через метаанотацію в тестовому класі, в ієрархії його супертипів або в ієрархії його об'ємних класів, то буде використовуватися режим спадкування об'ємної конфігурації за замовчуванням. Докладніше про те, як змінити режим за замовчуванням, див. нижче.

Зміна режиму спадкування об'ємної конфігурації за замовчуванням

За замовчуванням режим спадкування об'ємної конфігураціїINHERIT, але його можна змінити, встановивши системну властивість spring.test.enclosing.configuration з JVM в OVERRIDE. Як варіант, режим за замовчуванням можна встановити через механізм SpringProperties.

Spring TestContext Framework підтримує семантику анотації @NestedTestConfiguration для наступних анотацій.

Використання анотації @NestedTestConfiguration зазвичай має сенс тільки у поєднанні з позначеними анотацією тестовими класами з JUnit Jupiter; однак можуть існувати й інші тестові фреймворки з підтримкою Spring та вкладених тестових класів, які використовують цю анотацію.

Див. розділ "Конфігурація тестового класу з анотацією @Nested" для ознайомлення з прикладом та отримання більш детальної інформації.

@EnabledIf

Анотація @EnabledIf використовується для сигналу про те, що анотований тестовий клас із JUnit Jupiter або тестовий метод активований і повинен виконуватися, якщо зазначене expression виявляється true. Зокрема, якщо вираз має значення Boolean.TRUE або String дорівнює true (випадок ігнорування), тест активується. При застосуванні на рівні класу, всі методи тестування всередині цього класу також автоматично активуються за замовчуванням.

Вирази можуть мати будь-яку з таких форм:

Зверни увагу, однак, що текстовий літерал, який не є результатом динамічного дозволу плейсхолдера властивості, має нульову практичну цінність, оскільки анотація @EnabledIf("false") еквівалентна анотації @Disabled, а анотація @EnabledIf("true") логічно безглузда.

Можна використовувати анотацію @EnabledIf як метаанотацію для створення спеціальних складових анотацій. Наприклад, можна створити спеціальну анотацію @EnabledOnMac таким чином:

Java

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@EnabledIf(
    expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
    reason = "Enabled on Mac OS"
)
public @interface EnabledOnMac {}
Kotlin

@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@EnabledIf(
        expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
        reason = "Enabled on Mac OS"
)
annotation class EnabledOnMac {}

Анотація @EnabledOnMac служить виключно як приклад того, що це можливо. Якщо у тебе саме такий випадок, скористайся вбудованою підтримкою анотації @EnabledOnOs(MAC) у JUnit Jupiter.

Починаючи з JUnit 5.7, JUnit Jupiter також має умовну анотацію під назвою @EnabledIf. Таким чином, якщо тобі потрібно використовувати підтримку анотації @EnabledIf у Spring, переконайся, що ти імпортуєш тип анотації з правильного пакета.

@DisabledIf

Анотація @DisabledIf використовується для сигналізації про те, що анотований тестовий клас з JUnit Jupiter або тестовий метод заборонений і не повинен виконуватися, якщо надане вираз виявляється true. Зокрема, якщо вираз має значення Boolean.TRUE або String дорівнює true (випадок ігнорування), тест забороняється. При застосуванні на рівні класу всі тестові методи в цьому класі також автоматично забороняються. "https://javarush.com/quests/lectures/questspring.level01.lecture57#expressions">Spring Expression Language (SpEL). Приклад: @DisabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

  • Плейсхолдер для властивостей, доступних в Environment фреймоврка Spring. Приклад: @DisabledIf("${smoke.tests.disabled}")

  • Текстовий літерал. Приклад: @DisabledIf("true")

Зверни увагу, однак, що текстовий літерал, який не є результатом динамічного дозволу плейсхолдера властивості, має нульову практичну цінність, оскільки анотація @DisabledIf("true") еквівалентна анотації @Disabled, а анотація @DisabledIf("false") логічно безглузда.

Можна використовувати анотацію @DisabledIf як метаанотацію для створення спеціальних складових анотацій. Наприклад, можна створити спеціальну анотацію @DisabledOnMac таким чином:

Java

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(
    expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
    reason = "Disabled on Mac OS"
)
public @interface DisabledOnMac {}
Kotlin

@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@DisabledIf(
        expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
        reason = "Disabled on Mac OS"
)
annotation class DisabledOnMac {}

Анотація @DisabledOnMac служить виключно як приклад того, що це можливо. Якщо у тебе саме такий випадок, скористайся вбудованою підтримкою анотації @DisabledOnOs(MAC) в JUnit Jupiter. 5.7, JUnit Jupiter також має умовну анотацію під назвою @DisabledIf. Отже, якщо тобі потрібно використовувати підтримку анотації @DisabledIf у Spring, переконайся, що імпортуєш тип анотації з правильного пакета.