|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
Spring JUnit Jupiter 测试注解
当与SpringExtension和JUnit Jupiter一起使用时,支持以下注解
(即JUnit 5中的编程模型):
@SpringJUnitConfig
@SpringJUnitConfig 是一个组合注解,它将JUnit Jupiter的
@ExtendWith(SpringExtension.class) 与Spring TestContext框架的
@ContextConfiguration 相结合。它可在类级别用作
@ContextConfiguration 的直接替代品。在配置选项方面,
@ContextConfiguration 和 @SpringJUnitConfig 之间的唯一区别是,
组件类可以在 @SpringJUnitConfig 中使用 value 属性声明。
以下示例演示如何使用 @SpringJUnitConfig 注解指定配置类:
-
Java
-
Kotlin
@SpringJUnitConfig(TestConfig.class) (1)
class ConfigurationClassJUnitJupiterSpringTests {
// class body...
}
| 1 | 指定配置类。 |
@SpringJUnitConfig(TestConfig::class) (1)
class ConfigurationClassJUnitJupiterSpringTests {
// class body...
}
| 1 | 指定配置类。 |
以下示例展示如何使用 @SpringJUnitConfig 注解来指定配置文件的位置:
-
Java
-
Kotlin
@SpringJUnitConfig(locations = "/test-config.xml") (1)
class XmlJUnitJupiterSpringTests {
// class body...
}
| 1 | 指定配置文件的位置。 |
@SpringJUnitConfig(locations = ["/test-config.xml"]) (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
-
Kotlin
@SpringJUnitWebConfig(TestConfig.class) (1)
class ConfigurationClassJUnitJupiterSpringWebTests {
// class body...
}
| 1 | 指定配置类。 |
@SpringJUnitWebConfig(TestConfig::class) (1)
class ConfigurationClassJUnitJupiterSpringWebTests {
// class body...
}
| 1 | 指定配置类。 |
以下示例展示如何使用 @SpringJUnitWebConfig 注解来指定配置文件的位置:
-
Java
-
Kotlin
@SpringJUnitWebConfig(locations = "/test-config.xml") (1)
class XmlJUnitJupiterSpringWebTests {
// class body...
}
| 1 | 指定配置文件的位置。 |
@SpringJUnitWebConfig(locations = ["/test-config.xml"]) (1)
class XmlJUnitJupiterSpringWebTests {
// class body...
}
| 1 | 指定配置文件的位置。 |
请参阅上下文管理以及
@SpringJUnitWebConfig、
@ContextConfiguration和
@WebAppConfiguration
的javadoc获取更多细节。
@TestConstructor
@TestConstructor 是一个类型级别的注解,用于配置测试类构造函数的参数如何从测试的 ApplicationContext 中的组件自动注入。
如果测试类中不存在 @TestConstructor 或元呈现(meta-present),将使用默认的测试构造函数自动装配模式。有关如何更改默认模式的详细信息,请参阅下面的提示。但请注意,构造函数上 @Autowired 的本地声明优先级高于 @TestConstructor 和默认模式。
|
更改默认的测试构造函数自动装配模式
默认的测试构造函数自动装配模式可通过将
从 Spring Framework 5.3 开始,默认模式也可以作为 JUnit Platform 配置参数进行配置。 如果未设置 |
自 Spring Framework 5.2 起,@TestConstructor 仅在结合 SpringExtension 用于 JUnit Jupiter 时受支持。请注意,SpringExtension 通常会为您自动注册——例如,在使用诸如 @SpringJUnitConfig 和 @SpringJUnitWebConfig 等注解或 Spring Boot Test 提供的各种测试相关注解时。 |
@NestedTestConfiguration
@NestedTestConfiguration 是一个类型注解,用于配置在内部测试类的封闭类层次结构中如何处理 Spring 测试配置注解。
如果在测试类、其超类层次结构或其封闭类层次结构中没有出现@NestedTestConfiguration,则将使用默认的封闭配置继承模式。有关如何更改默认模式的详细信息,请参阅下面的提示。
|
更改默认封装配置继承模式
默认的 封闭配置继承模式 是 |
Spring TestContext Framework 会遵循以下注解的 @NestedTestConfiguration 语义。
使用 @NestedTestConfiguration 通常只在与 JUnit Jupiter 中的 @Nested 个测试类结合时才有意义;然而,可能还有其他支持 Spring 和嵌套测试类的测试框架会使用此注解。 |
查看 @Nested 测试类配置 以获取示例和更多详细信息。
@EnabledIf
@EnabledIf 用于表示:当提供的 expression 表达式求值为 true 时,带注解的 JUnit Jupiter 测试类或测试方法应被启用并执行。
具体而言,若表达式求值为 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 还有一个名为 |
@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 还有一个名为 |