跳到主要内容
版本:7.0.3

Spring JUnit Jupiter 测试注解

Hunyuan 7b 中英对照 Spring JUnit Jupiter Testing Annotations

当与 SpringExtension 和 JUnit Jupiter(即 JUnit 中的编程模型)结合使用时,支持以下注解:

@SpringJUnitConfig

@SpringJUnitConfig 是一个组合注解,它结合了 JUnit Jupiter 中的 @ExtendWith(SpringExtension.class) 和 Spring TestContext Framework 中的 @ContextConfiguration。它可以在类级别使用,作为 @ContextConfiguration 的直接替代品。在配置选项方面,@ContextConfiguration@SpringJUnitConfig 之间的唯一区别是,在 @SpringJUnitConfig 中可以为主组件类指定 value 属性。

以下示例展示了如何使用@SpringJUnitConfig注解来指定一个配置类:

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

以下示例展示了如何使用@SpringJUnitConfig注解来指定配置文件的位置:

@SpringJUnitConfig(locations = "/test-config.xml") 1
class XmlJUnitJupiterSpringTests {
// class body...
}
  • 指定配置文件的位置。

有关更多详细信息,请参阅上下文管理,以及@SpringJUnitConfig@ContextConfiguration的javadoc。

@SpringJUnitWebConfig

@SpringJUnitWebConfig是一个组合注解,它结合了JUnit Jupiter中的@ExtendWith(SpringExtension.class)以及Spring TestContext Framework中的@ContextConfiguration@WebAppConfiguration。你可以在类级别使用它,作为@ContextConfiguration@WebAppConfiguration的直接替代品。就配置选项而言,@ContextConfiguration@SpringJUnitWebConfig之间唯一的区别在于:在@SpringJUnitWebConfig中,你可以通过value属性来声明组件类;此外,要覆盖@WebAppConfiguration中的value属性,只能通过@SpringJUnitWebConfig中的resourcePath属性来实现。

以下示例展示了如何使用@SpringJUnitWebConfig注解来指定一个配置类:

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

以下示例展示了如何使用@SpringJUnitWebConfig注解来指定配置文件的位置:

@SpringJUnitWebConfig(locations = "/test-config.xml") 1
class XmlJUnitJupiterSpringWebTests {
// class body...
}
  • 指定配置文件的位置。

有关更多详细信息,请参阅上下文管理,以及@SpringJUnitWebConfig@ContextConfiguration@WebAppConfiguration的Java文档。

@TestConstructor

@TestConstructor 是一个注解,可以应用于测试类,用于配置如何从测试的 ApplicationContext 中的组件自动注入测试类构造函数的参数。

如果测试类上没有或未使用@TestConstructor注解,那么将使用默认的测试构造函数自动注入模式。有关如何更改默认模式的详细信息,请参见下面的提示。但请注意,在构造函数上直接声明@Autowired@jakarta.inject Inject注解的优先级要高于@TestConstructor和默认模式。

提示

更改默认的测试构造函数自动注入模式

可以通过将 spring.testconstructor-autowire.mode JVM 系统属性设置为 all 来更改默认的测试构造函数自动注入模式。或者,也可以通过 SpringProperties 机制来设置默认模式。

默认模式也可以作为 JUnit 平台配置参数 进行配置。

如果未设置 spring.testconstructor.autowire.mode 属性,测试类构造函数将不会被自动注入。

备注

@TestConstructor 仅在与 SpringExtension 结合使用时才适用于 JUnit Jupiter。请注意,SpringExtension 通常会自动为您注册——例如,在使用 @SpringJUnitConfig@SpringJUnitWebConfig 等注解或来自 Spring Boot Test 的各种与测试相关的注解时。

@NestedTestConfiguration

@NestedTestConfiguration 是一种注释,可以应用于测试类,用于配置在嵌套的测试类层次结构中,Spring 测试配置注释的处理方式。

如果测试类、其超类层次结构或包含类层次结构中不存在@NestedTestConfiguration修饰符,那么将使用默认的包含配置继承模式。有关如何更改默认模式的详细信息,请参阅下面的提示。

提示

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

默认的“封装配置继承模式”是INHERIT,但可以通过将spring.test.enclosing.configuration JVM系统属性设置为OVERRIDE来更改它。或者,也可以通过SpringProperties机制来设置默认模式。

Spring TestContext框架 对以下注解支持 @NestedTestConfiguration 的语义。

备注

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

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

@EnabledIf

@EnabledIf 用于指示被注释的 JUnit Jupiter 测试类或测试方法应该是启用的,并且应该在提供的 expression 评估为 true 时运行。具体来说,如果表达式的值为 Boolean.TRUE 或等于 trueString(不区分大小写),则该测试会被启用。当在类级别应用此注解时,该类中的所有测试方法也会默认被启用。

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

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

  • 用于表示在Spring 环境中可用的属性的占位符。例如:@EnabledIf("${smoke.tests.enabled}")

  • 文本字面量。例如:@EnabledIf("true")

然而,请注意,如果不是通过属性占位符的动态解析得到的文本字面量,那么它的实际价值为零,因为@EnabledIf("false")等同于@Disabled,而@EnabledIf("true")在逻辑上是没有意义的。

你可以使用@EnabledIf作为元注释来创建自定义的组合注释。例如,你可以按照以下方式创建一个自定义的@EnabledOnMac注释:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@EnabledIf(
expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
reason = "Enabled on Mac OS"
)
public @interface EnabledOnMac {}
备注

@EnabledOnMac 仅作为一个可能的示例。如果您有完全相同的用例,请使用 JUnit Jupiter 中内置的 @EnabledOnOs(MAC) 支持。

注意

从JUnit 5.7开始,JUnit Jupiter也有了一个名为@EnabledIf的条件注解。因此,如果你想使用Spring的@EnabledIf支持,请确保从正确的包中导入该注解类型。

@DisabledIf

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

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

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

  • 用于表示在Spring 环境中可用的属性的占位符。例如:@DisabledIf("${smoke.tests.disabled}")

  • 文本字面量。例如:@DisabledIf("true")

然而,请注意,如果不是通过动态解析属性占位符得到的文本字面量,那么它在实际用途中是没有价值的,因为@DisabledIf("true")等同于@Disabled,而@DisabledIf("false")在逻辑上是没有意义的。

你可以使用 @DisabledIf 作为元注释来创建自定义的组合注释。例如,你可以按照以下方式创建一个自定义的 @DisabledOnMac 注释:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(
expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
reason = "Disabled on Mac OS"
)
public @interface DisabledOnMac {}
备注

@DisabledOnMac 仅仅是一个示例,用来说明什么是可行的。如果你有完全相同的用例,请使用 JUnit Jupiter 中内置的 @DisabledOnOs(MAC) 支持。

注意

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