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

  • 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或元注解,将使用默认的测试构造函数自动装配模式。有关如何更改默认模式的详细信息,请参阅下面的提示。但是,请注意,构造函数上的@Autowired@jakarta.inject.Inject@javax.inject.Inject的本地声明优先于@TestConstructor和默认模式。

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

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

从Spring Framework 5.3开始,默认模式也可以配置为JUnit Platform配置参数

如果未设置spring.test.constructor.autowire.mode属性,则测试类构造函数将不会自动进行自动装配。

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

@NestedTestConfiguration

@NestedTestConfiguration是一种类型级别的注解,用于配置Spring测试配置注解在内部测试类的封闭类层次结构中的处理方式。

如果在测试类中不存在@NestedTestConfiguration,也不是元注解,那么在其超类型层次结构或封闭类层次结构中将使用默认的封闭配置继承模式。有关如何更改默认模式的详细信息,请参阅下面的提示。

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

默认的封闭配置继承模式INHERIT,但可以通过将spring.test.enclosing.configuration JVM系统属性设置为OVERRIDE来更改。另外,也可以通过SpringProperties机制设置默认模式。

Spring TestContext Framework遵循以下注解的@NestedTestConfiguration语义。

通常只有在JUnit Jupiter中与@Nested测试类一起使用@NestedTestConfiguration才有意义;但是,可能还有其他支持Spring和嵌套测试类的测试框架使用此注解。

有关示例和更多详细信息,请参阅@Nested测试类配置

@EnabledIf

@EnabledIf用于表示注解的JUnit Jupiter测试类或测试方法已启用,并且应在提供的expression评估为true时运行。具体来说,如果表达式评估为Boolean.TRUEtrue(不区分大小写的字符串),则测试被启用。当应用于类级别时,默认情况下该类中的所有测试方法也会自动启用。

表达式可以是以下任何一种:

  • 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 {}

@EnabledOnMac仅作为可能的示例。如果您有确切的使用情况,请使用JUnit Jupiter中内置的@EnabledOnOs(MAC)支持。

自JUnit 5.7起,JUnit Jupiter还具有名为@EnabledIf的条件注解。因此,如果您希望使用Spring的@EnabledIf支持,请确保从正确的包中导入注解类型。

@DisabledIf

@DisabledIf用于表示已注释的JUnit Jupiter测试类或测试方法已禁用,如果提供的expression求值为true,则不应运行。具体来说,如果表达式求值为Boolean.TRUEtrue(不区分大小写的String),则测试被禁用。当应用于类级别时,该类中的所有测试方法也会自动禁用。

表达式可以是以下任何一种:

  • Spring表达式语言(SpEL)表达式。例如:@DisabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")

  • Spring 环境中可用属性的占位符。例如:@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 {}

@DisabledOnMac仅作为可能性的示例。如果您有确切的使用情况,请使用JUnit Jupiter中内置的@DisabledOnOs(MAC)支持。

自JUnit 5.7起,JUnit Jupiter还具有名为@DisabledIf的条件注解。因此,如果您希望使用Spring的@DisabledIf支持,请确保从正确的包中导入注解类型。