Spring JUnit Jupiter 测试注解
当与 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) [id="CO1-1"][id="CO1-1"][id="CO1-1"](1) class ConfigurationClassJUnitJupiterSpringTests { // class body... }
<1> 指定配置类。
- Kotlin
-
@SpringJUnitConfig(TestConfig::class) [id="CO2-1"][id="CO1-2"][id="CO2-1"](1) class ConfigurationClassJUnitJupiterSpringTests { // class body... }
<1> 指定配置类。
以下示例展示了如何使用 @SpringJUnitConfig
注解来指定配置文件的位置:
- Java
-
@SpringJUnitConfig(locations = "/test-config.xml") [id="CO3-1"][id="CO1-3"][id="CO3-1"](1) class XmlJUnitJupiterSpringTests { // class body... }
<1> 指定配置文件的位置。
- Kotlin
-
@SpringJUnitConfig(locations = ["/test-config.xml"]) [id="CO4-1"][id="CO1-4"][id="CO4-1"](1) class XmlJUnitJupiterSpringTests { // class body... }
<1> 指定配置文件的位置。
有关更多详细信息,请参阅 上下文管理 以及
@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) [id="CO5-1"][id="CO1-5"][id="CO5-1"](1) class ConfigurationClassJUnitJupiterSpringWebTests { // class body... }
<1> 指定配置类。
- Kotlin
-
@SpringJUnitWebConfig(TestConfig::class) [id="CO6-1"][id="CO1-6"][id="CO6-1"](1) class ConfigurationClassJUnitJupiterSpringWebTests { // class body... }
<1> 指定配置类。
以下示例展示了如何使用 @SpringJUnitWebConfig
注解来指定配置文件的位置:
- Java
-
@SpringJUnitWebConfig(locations = "/test-config.xml") [id="CO7-1"][id="CO1-7"][id="CO7-1"](1) class XmlJUnitJupiterSpringWebTests { // class body... }
<1> 指定配置文件的位置。
- Kotlin
-
@SpringJUnitWebConfig(locations = ["/test-config.xml"]) [id="CO8-1"][id="CO1-8"][id="CO8-1"](1) class XmlJUnitJupiterSpringWebTests { // class body... }
<1> 指定配置文件的位置。
有关更多详细信息,请参阅 上下文管理 以及
@SpringJUnitWebConfig
、
@ContextConfiguration
和
@WebAppConfiguration
的 javadoc。
@TestConstructor
@TestConstructor
是一个可以应用于测试类的注解,用于配置如何从测试的
ApplicationContext
中的组件自动装配测试类构造函数的参数。
如果测试类上不存在或元存在 @TestConstructor
,则将使用默认的 测试构造函数自动装配模式。
有关如何更改默认模式的详细信息,请参阅下面的提示。
请注意,构造函数上的 @Autowired
、@jakarta.inject.Inject
或 @javax.inject.Inject
的本地声明优先于 @TestConstructor
和默认模式。
更改默认测试构造函数自动装配模式
可以通过将 |
|
@NestedTestConfiguration
@NestedTestConfiguration
是一个可以应用于测试类的注解,用于配置在内部测试类的
封闭类层次结构中如何处理 Spring 测试配置注解。
如果测试类、其超类型层次结构或其封闭类层次结构中不存在或元存在 @NestedTestConfiguration
,
则将使用默认的 封闭配置继承模式。有关如何更改默认模式的详细信息,请参阅下面的提示。
更改默认封闭配置继承模式
默认的 封闭配置继承模式 是 |
Spring TestContext Framework 遵循以下注解的 @NestedTestConfiguration
语义。
|
有关示例和更多详细信息,请参阅 @Nested
测试类配置。
@EnabledIf
@EnabledIf
用于表示带注解的 JUnit Jupiter 测试类或测试方法在提供的 expression
评估为 true
时启用并应运行。具体来说,如果表达式评估为 Boolean.TRUE
或等于 true
(忽略大小写)的 String
,则测试启用。当应用于类级别时,该类中的所有测试方法默认也会自动启用。
表达式可以是以下任何一种:
-
Spring 表达式语言 (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 表达式语言 (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
支持,请确保从正确的包导入注解类型。