预先支持测试
本章介绍了使用 Spring TestContext 框架进行集成测试的 Spring 预编译(AOT)支持。
测试支持通过以下功能扩展了 Spring 的核心 AOT 支持。
-
构建时检测当前项目中使用 TestContext 框架加载
ApplicationContext
的所有集成测试。- 明确支持基于 JUnit Jupiter 和 JUnit 4 的测试类,以及隐式支持使用 Spring 核心测试注解的 TestNG 和其他测试框架——只要测试是使用为当前项目注册的 JUnit Platform
TestEngine
运行的。
- 明确支持基于 JUnit Jupiter 和 JUnit 4 的测试类,以及隐式支持使用 Spring 核心测试注解的 TestNG 和其他测试框架——只要测试是使用为当前项目注册的 JUnit Platform
-
构建时 AOT 处理:当前项目中每个唯一的测试
ApplicationContext
将被刷新以进行 AOT 处理。 -
运行时 AOT 支持:在 AOT 运行时模式下执行时,Spring 集成测试将使用 AOT 优化的
ApplicationContext
,该上下文透明地参与上下文缓存。
所有测试在 AOT 模式下默认启用。然而,你可以通过为其添加 @DisabledInAotMode 注解,选择性地在 AOT 模式下禁用整个测试类或单个测试方法。在使用 JUnit Jupiter 时,你可以通过 Jupiter 的 @EnabledInNativeImage
和 @DisabledInNativeImage
注解选择性地在 GraalVM 原生镜像中启用或禁用测试。请注意,@DisabledInAotMode
也会在 GraalVM 原生镜像中运行时禁用被注解的测试类或测试方法,这与 JUnit Jupiter 的 @DisabledInNativeImage
注解类似。
默认情况下,如果在构建时 AOT 处理过程中遇到错误,将抛出异常,并且整个过程将立即失败。
如果您希望在遇到错误后继续构建时 AOT 处理,可以禁用 failOnError
模式,这将导致错误以 WARN
级别或更详细的 DEBUG
级别记录。
可以通过在命令行或构建脚本中将名为 spring.test.aot.processing.failOnError
的 JVM 系统属性设置为 false
来禁用 failOnError
模式。或者,您可以通过 SpringProperties 机制设置相同的属性。
@ContextHierarchy
注解在 AOT 模式下不支持。
要为 GraalVM 本机镜像中使用的测试特定运行时提示提供信息,您有以下选项。
-
实现一个自定义的 TestRuntimeHintsRegistrar 并通过
META-INF/spring/aot.factories
全局注册。 -
实现一个自定义的 RuntimeHintsRegistrar 并通过
META-INF/spring/aot.factories
全局注册,或通过 @ImportRuntimeHints 在测试类上局部注册。 -
使用 @Reflective 或 @RegisterReflectionForBinding 注解一个测试类。
-
有关 Spring 核心运行时提示和注解支持的详细信息,请参见 运行时提示。
TestRuntimeHintsRegistrar
API 是核心 RuntimeHintsRegistrar
API 的辅助工具。如果您需要为测试支持注册不特定于特定测试类的全局提示,建议实现 RuntimeHintsRegistrar
而不是特定于测试的 API。
如果你实现一个自定义的 ContextLoader
,它必须实现 AotContextLoader,以便提供 AOT 构建时处理和 AOT 运行时执行支持。不过请注意,Spring Framework 和 Spring Boot 提供的所有上下文加载器实现已经实现了 AotContextLoader
。
如果你实现一个自定义的 TestExecutionListener
,它必须实现 AotTestExecutionListener,以便参与 AOT 处理。可以查看 spring-test
模块中的 SqlScriptsTestExecutionListener
作为示例。