Следующие аннотации поддерживаются при использовании в сочетании с SpringExtension
и JUnit Jupiter (то есть моделью программирования в JUnit 5):
@SpringJUnitConfig
@SpringJUnitConfig
– это составная аннотация, которая объединяет @ExtendWith(SpringExtension.class)
из JUnit Jupiter с @ContextConfiguration
из Spring TestContext Framework. Её можно использовать на уровне класса в качестве замены @ContextConfiguration
. Что касается параметров конфигурации, единственное различие между аннотациями @ContextConfiguration
и @SpringJUnitConfig
заключается в том, что в аннотации @SpringJUnitConfig классы компонентов могут быть объявлены с атрибутом value
.
В следующем примере показано, как использовать аннотацию @SpringJUnitConfig
для задания конфигурационного класса:
@SpringJUnitConfig(TestConfig.class)
class ConfigurationClassJUnitJupiterSpringTests {
// тело класса...
}
- Задаем конфигурационный класс.
@SpringJUnitConfig(TestConfig::class)
class ConfigurationClassJUnitJupiterSpringTests {
// тело класса...
}
- Задаем конфигурационный класс.
В следующем примере показано, как использовать аннотацию @SpringJUnitConfig
для задания местоположения конфигурационного файла:
@SpringJUnitConfig(locations = "/test-config.xml")
class XmlJUnitJupiterSpringTests {
// тело класса...
}
- Задаем местоположение конфигурационного файла.
@SpringJUnitConfig(locations = ["/test-config.xml"])
class XmlJUnitJupiterSpringTests {
// тело класса...
}
- Задаем местоположение конфигурационного файла.
Более подробную информацию см. в разделе "Управление контекстом", а также в 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
для задания конфигурационного класса:
@SpringJUnitWebConfig(TestConfig.class)
class ConfigurationClassJUnitJupiterSpringWebTests {
// тело класса...
}
- Задаем конфигурационный класс.
@SpringJUnitWebConfig(TestConfig::class)
class ConfigurationClassJUnitJupiterSpringWebTests {
// тело класса...
}
- Задаем конфигурационный класс.
В следующем примере показано, как использовать аннотацию @SpringJUnitWebConfig
для задания местоположения файла конфигурации:
@SpringJUnitWebConfig(locations = "/test-config.xml")
class XmlJUnitJupiterSpringWebTests {
// тело класса...
}
- Задаем местоположение конфигурационного файла.
@SpringJUnitWebConfig(locations = ["/test-config.xml"])
class XmlJUnitJupiterSpringWebTests {
// тело класса...
}
- Задаем местоположение конфигурационного файла.
Более подробную информацию см. в разделе "Управление контекстом", а также в 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
не установлено, конструкторы тестовых классов не будут автоматически обнаруживаться и связываться.
@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
следующим образом:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@EnabledIf(
expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
reason = "Enabled on Mac OS"
)
public @interface EnabledOnMac {}
@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
следующим образом:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(
expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
reason = "Disabled on Mac OS"
)
public @interface DisabledOnMac {}
@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, убедитесь, что импортируете тип аннотации из правильного пакета.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ