Spring JUnit Jupiter Testing Annotations
与 SpringExtension
和 JUnit Jupiter(即 JUnit 5 中的编程模型)结合使用时,支持以下注释:
@SpringJUnitConfig
@SpringJUnitConfig
是一个组合注释,它将 JUnit Jupiter 中的 @ExtendWith(SpringExtension.class)
与 Spring TestContext Framework 中的 @ContextConfiguration
结合在一起。可以将其用在类级别,作为 @ContextConfiguration
的替代。关于配置选项,@ContextConfiguration
和 @SpringJUnitConfig
之间的惟一区别是组件类可以使用 @SpringJUnitConfig
中的 `value `属性进行声明。
以下示例演示了如何使用 @SpringJUnitConfig
注释指定配置类:
- Java
-
@SpringJUnitConfig(TestConfig.class) (1) class ConfigurationClassJUnitJupiterSpringTests { // class body... }
1 | Specify the configuration class.
|
2 | Specify the configuration class. |
以下示例演示了如何使用 @SpringJUnitConfig
注释指定配置文件的位置:
- Java
-
@SpringJUnitConfig(locations = "/test-config.xml") (1) class XmlJUnitJupiterSpringTests { // class body... }
1 | 指定配置文件的位置。
|
2 | 指定配置文件的位置。 |
请参阅 Context Management 以及https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/junit/jupiter/SpringJUnitConfig.html[@SpringJUnitConfig
]和 @ContextConfiguration
的 javadoc 了解更多详情。
@SpringJUnitWebConfig
@SpringJUnitWebConfig
是一个组合注释,它将 JUnit Jupiter 中的 @ExtendWith(SpringExtension.class)
与 Spring TestContext Framework 中的 @ContextConfiguration
和 @WebAppConfiguration
结合在一起。可以将其用在类级别,作为 @ContextConfiguration
和 @WebAppConfiguration
的替代。关于配置选项,@ContextConfiguration
和 @SpringJUnitWebConfig
之间的惟一区别是你可以使用 @SpringJUnitWebConfig
中的 value
属性来声明组件类。此外,只能使用 @SpringJUnitWebConfig
中的 resourcePath
属性来覆盖 @WebAppConfiguration
中的 value
属性。
以下示例演示了如何使用 @SpringJUnitWebConfig
注释指定配置类:
- Java
-
@SpringJUnitWebConfig(TestConfig.class) (1) class ConfigurationClassJUnitJupiterSpringWebTests { // class body... }
1 | Specify the configuration class.
|
2 | Specify the configuration class. |
以下示例演示了如何使用 @SpringJUnitWebConfig
注释指定配置文件的位置:
- Java
-
@SpringJUnitWebConfig(locations = "/test-config.xml") (1) class XmlJUnitJupiterSpringWebTests { // class body... }
1 | 指定配置文件的位置。
|
2 | 指定配置文件的位置。 |
请参阅 Context Management 以及https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/junit/jupiter/web/SpringJUnitWebConfig.html[@SpringJUnitWebConfig
]、https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/ContextConfiguration.html[@ContextConfiguration
]和https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/web/WebAppConfiguration.html[@WebAppConfiguration
]的 javadoc 了解更多详情。
@TestConstructor
@TestConstructor
是一个注释,可以应用到测试类中,以配置如何自动装配测试类构造函数的参数,这些参数来自测试的 ApplicationContext
中的组件。
如果 @TestConstructor
没有出现在测试类或元出现,则将使用默认的 test constructor autowire mode。有关如何更改此默认模式的详细信息,请参阅下面的提示。但是,请注意,构造函数上的 @Autowired
,@jakarta.inject.Inject
, 或 @javax.inject.Inject
的局部声明优先于 @TestConstructor
和默认模式。
Changing the default test constructor autowire mode
可以通过将 |
从 Spring Framework 5.2 起, |
@NestedTestConfiguration
@NestedTestConfiguration
是一种注释,可应用于测试类以配置在内部测试类的封闭类层次结构内如何处理 Spring 测试配置注释。
如果 @NestedTestConfiguration
不存在或在其元数据中不存在于测试类中、其超类型层次结构中或其封闭类层次结构中,则将使用默认的 封闭配置继承模式。请参阅下面的提示,了解如何更改默认模式的详细信息。
Changing the default enclosing configuration inheritance mode
默认 enclosing configuration inheritance mode 为 |
Spring TestContext Framework 遵循以下注解的 @NestedTestConfiguration
语义。
使用 |
有关示例和进一步的详细信息,请参阅 xref:testing/testcontext-framework/support-classes.adoc#testcontext-junit-jupiter-nested-test-configuration[@Nested
测试类配置。
@EnabledIf
@EnabledIf
用于表示已注释的 JUnit Jupiter 测试类或测试方法已启用,并且如果提供的 expression
计算结果为 true
,则应运行该类或方法。具体而言,如果表达式的计算结果为 Boolean.TRUE
或等于 true
的 String
(忽略大小写),则测试将启用。在类级别应用时,该类中的所有测试方法在默认情况下也会自动启用。
表达式可以是以下任何一个:
-
Spring Expression Language (SpEL) 表达式。例如:
@EnabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")
-
Spring
Environment
中可用的属性的占位符。例如:@EnabledIf("${smoke.tests.enabled}")
-
文本文字。例如:
@EnabledIf("true")
但请注意,不是动态解析属性占位符结果的文本文字没有实际价值,因为 @EnabledIf("false")
等同于 @Disabled
,而 @EnabledIf("true")
在逻辑上没有意义。
您可以将 @EnabledIf
用作元注释来创建自定的组合注释。例如,您可以按以下方式创建自定的 @EnabledOnMac
注释:
-
Java
-
Kotlin
@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 {}
|
自 JUnit 5.7 以来,JUnit Jupiter 还具有名为 @EnabledIf
的条件注释。因此,如果您希望使用 Spring 的 @EnabledIf
支持,请确保从正确的包中导入注释类型。
@DisabledIf
@DisabledIf
用于表示已注释的 JUnit Jupiter 测试类或测试方法已禁用,并且如果提供的 expression
计算结果为 true
,则不应运行该类或方法。具体而言,如果表达式的计算结果为 Boolean.TRUE
或等于 true
的 String
(忽略大小写),则测试将禁用。在类级别应用时,该类中的所有测试方法在默认情况下也会自动禁用。
表达式可以是以下任何一个:
-
Spring Expression Language (SpEL) 表达式。例如:
@DisabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")
-
Spring
Environment
中可用的属性的占位符。例如:@DisabledIf("${smoke.tests.disabled}")
-
文本文字。例如:
@DisabledIf("true")
但请注意,不是动态解析属性占位符结果的文本文字没有实际价值,因为 @DisabledIf("true")
等同于 @Disabled
,而 @DisabledIf("false")
在逻辑上没有意义。
您可以将 @DisabledIf
用作元注释来创建自定的组合注释。例如,您可以按以下方式创建自定的 @DisabledOnMac
注释:
-
Java
-
Kotlin
@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 {}
|
自 JUnit 5.7 以来,JUnit Jupiter 还具有名为 @DisabledIf
的条件注释。因此,如果您希望使用 Spring 的 @DisabledIf
支持,请确保从正确的包中导入注释类型。