对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

Spring JUnit Jupiter 测试注解

@SpringJUnitConfig

@SpringJUnitConfig 是一个组合注解,它将 JUnit Jupiter 中的 @ExtendWith(SpringExtension.class) 与 Spring TestContext 框架中的 @ContextConfiguration 结合在一起。它可以作为 @ContextConfiguration 的直接替代品,在类级别上使用。就配置选项而言,@ContextConfiguration@SpringJUnitConfig 唯一的区别在于,组件类可以通过 value@SpringJUnitConfig 属性进行声明。spring-doc.cadn.net.cn

以下示例展示了如何使用 @SpringJUnitConfig 注解来指定一个配置类:spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class) (1)
class ConfigurationClassJUnitJupiterSpringTests {
	// class body...
}
1 指定配置类。
@SpringJUnitConfig(TestConfig::class) (1)
class ConfigurationClassJUnitJupiterSpringTests {
	// class body...
}
1 指定配置类。

以下示例展示了如何使用 @SpringJUnitConfig 注解来指定配置文件的位置:spring-doc.cadn.net.cn

@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 以获取更多详细信息。spring-doc.cadn.net.cn

@SpringJUnitWebConfig

@SpringJUnitWebConfig 是一个组合注解,它结合了来自 JUnit Jupiter 的 @ExtendWith(SpringExtension.class) 与来自 Spring TestContext Framework 的 @ContextConfiguration@WebAppConfiguration。您可以在类级别使用它,作为 @ContextConfiguration@WebAppConfiguration 的直接替代方案。关于配置选项,@ContextConfiguration@SpringJUnitWebConfig 之间的唯一区别是:您可以在 @SpringJUnitWebConfig 中使用 value 属性来声明组件类。此外,您只能通过在使用 @SpringJUnitWebConfig 时指定 resourcePath 属性,来覆盖来自 @WebAppConfigurationvalue 属性。spring-doc.cadn.net.cn

以下示例展示了如何使用 @SpringJUnitWebConfig 注解来指定一个配置类:spring-doc.cadn.net.cn

@SpringJUnitWebConfig(TestConfig.class) (1)
class ConfigurationClassJUnitJupiterSpringWebTests {
	// class body...
}
1 指定配置类。
@SpringJUnitWebConfig(TestConfig::class) (1)
class ConfigurationClassJUnitJupiterSpringWebTests {
	// class body...
}
1 指定配置类。

以下示例展示了如何使用 @SpringJUnitWebConfig 注解来指定配置文件的位置:spring-doc.cadn.net.cn

@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 以获取更多详细信息。spring-doc.cadn.net.cn

@TestConstructor

@TestConstructor 是一个类级别的注解,用于配置如何从测试的 ApplicationContext 中的组件自动装配测试类构造函数的参数。spring-doc.cadn.net.cn

如果测试类上未直接或通过元注解使用 @TestConstructor,则将使用默认的测试构造函数自动装配模式。有关如何更改默认模式的详细信息,请参见下方提示。但请注意,在构造函数上本地声明的 @Autowired 注解优先级高于 @TestConstructor 和默认模式。spring-doc.cadn.net.cn

更改默认的测试构造函数自动装配模式

默认的测试构造函数自动装配模式可以通过将 JVM 系统属性spring.test.constructor.autowire.mode设置为all来更改。或者,也可以通过 SpringProperties机制来设置默认模式。spring-doc.cadn.net.cn

从 Spring Framework 5.3 起,默认模式也可以配置为JUnit Platform 配置参数spring-doc.cadn.net.cn

如果未设置 spring.test.constructor.autowire.mode 属性,则测试类的构造函数将不会被自动装配。spring-doc.cadn.net.cn

从 Spring Framework 5.2 起,@TestConstructor 仅支持与 JUnit Jupiter 配合使用时的 SpringExtension。请注意,SpringExtension 通常会自动为您注册——例如,当使用诸如 @SpringJUnitConfig@SpringJUnitWebConfig 等注解,或 Spring Boot Test 中的各种测试相关注解时。

@NestedTestConfiguration

@NestedTestConfiguration 是一个类级别的注解,用于配置在内部测试类的封闭类层次结构中如何处理 Spring 测试配置注解。spring-doc.cadn.net.cn

如果测试类、其超类层次结构或其外部类层次结构中不存在(或未通过元注解存在)@NestedTestConfiguration,则将使用默认的外部配置继承模式。有关如何更改默认模式的详细信息,请参见下方提示。spring-doc.cadn.net.cn

更改默认的封闭配置继承模式

默认的封闭配置继承模式INHERIT,但可以通过将spring.test.enclosing.configurationJVM 系统属性设置为OVERRIDE来更改。或者,也可以通过SpringProperties机制设置默认模式。spring-doc.cadn.net.cn

Spring TestContext 框架 遵循以下注解的 @NestedTestConfiguration 语义。spring-doc.cadn.net.cn

@NestedTestConfiguration 的使用通常仅在与 JUnit Jupiter 中的 @Nested 测试类结合时才有意义;然而,也可能存在其他支持 Spring 和嵌套测试类的测试框架会使用此注解。

请参阅 @Nested 测试类配置 以获取示例和更多详情。spring-doc.cadn.net.cn

@EnabledIf

@EnabledIf 用于表明被注解的 JUnit Jupiter 测试类或测试方法 在所提供的 expression 表达式求值为 true 时启用并应予以执行。 具体来说,如果该表达式求值结果为 Boolean.TRUE 或一个(忽略大小写的)等于 Stringtrue, 则该测试将被启用。当此注解应用于类级别时,该类中的所有测试方法默认也会自动启用。spring-doc.cadn.net.cn

表达式可以是以下任意一种:spring-doc.cadn.net.cn

然而请注意,如果一个文本字面量并非属性占位符动态解析的结果,那么它实际上毫无用处,因为 @EnabledIf("false") 等同于 @Disabled,而 @EnabledIf("true") 在逻辑上则毫无意义。spring-doc.cadn.net.cn

你可以将 @EnabledIf 用作元注解(meta-annotation)来创建自定义的组合注解。例如,你可以按如下方式创建一个自定义的 @EnabledOnMac 注解:spring-doc.cadn.net.cn

@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 仅作为可能实现方式的一个示例。如果您恰好有这种使用场景,请使用 JUnit Jupiter 内置的 @EnabledOnOs(MAC) 支持。spring-doc.cadn.net.cn

从 JUnit 5.7 开始,JUnit Jupiter 也提供了一个名为 @EnabledIf 的条件注解。因此, 如果你希望使用 Spring 的 @EnabledIf 支持,请确保从正确的包中导入该注解类型。spring-doc.cadn.net.cn

@DisabledIf

@DisabledIf 用于表明被注解的 JUnit Jupiter 测试类或测试方法在所提供的 expression 表达式求值为 true 时应被禁用且不应执行。具体来说,如果该表达式求值结果为 Boolean.TRUE 或一个(忽略大小写的)等于 Stringtrue,则该测试将被禁用。当此注解应用于类级别时,该类中的所有测试方法也会自动被禁用。spring-doc.cadn.net.cn

表达式可以是以下任意一种:spring-doc.cadn.net.cn

然而请注意,如果一个文本字面量并非属性占位符动态解析的结果,那么它实际上毫无用处,因为 @DisabledIf("true") 等同于 @Disabled,而 @DisabledIf("false") 在逻辑上则毫无意义。spring-doc.cadn.net.cn

你可以将 @DisabledIf 用作元注解(meta-annotation)来创建自定义的组合注解。例如,你可以按如下方式创建一个自定义的 @DisabledOnMac 注解:spring-doc.cadn.net.cn

@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 仅作为可能实现方式的一个示例。如果您恰好有这种使用场景,请使用 JUnit Jupiter 内置的 @DisabledOnOs(MAC) 支持。spring-doc.cadn.net.cn

从 JUnit 5.7 开始,JUnit Jupiter 也提供了一个名为 @DisabledIf 的条件注解。因此, 如果你希望使用 Spring 的 @DisabledIf 支持,请确保从正确的包中导入该注解类型。spring-doc.cadn.net.cn