Следующие аннотации поддерживаются при использовании в сочетании с 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 обычно имеет смысл только в сочетании с помеченными аннотацией @Nested тестовыми классами из JUnit Jupiter; однако могут существовать и другие тестовые фреймворки с поддержкой Spring и вложенных тестовых классов, которые используют эту аннотацию.

См. раздел "Конфигурация тестового класса с аннотацией @Nested" для ознакомления с примером и получения более подробной информации.

@EnabledIf

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

Выражения могут иметь любую из следующих форм:

  • Выражение на языке Spring Expression Language (SpEL). Пример: @EnabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

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

  • Текстовый литерал. Пример: @EnabledIf("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 (случай игнорирования), тест запрещается. При применении на уровне класса все тестовые методы в этом классе также автоматически запрещаются.

Выражения могут иметь любую из следующих форм:

  • Выражение на языке 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.

Начиная с JUnit 5.7, JUnit Jupiter также имеет условную аннотацию под названием @DisabledIf. Таким образом, если вам нужно использовать поддержку аннотации @DisabledIf в Spring, убедитесь, что импортируете тип аннотации из правильного пакета.