测试的预先支持

本章涵盖了 Spring 使用 Spring TestContext 框架对集成测试的提前(AOT)支持。

测试支持通过以下功能扩展了 Spring 的 核心 AOT 支持

  • 构建时检测当前项目中所有使用 TestContext 框架加载 ApplicationContext 的集成测试。

    • 为基于 JUnit Jupiter 和 JUnit 4 的测试类提供显式支持,并为 TestNG 和其他使用 Spring 核心测试注解的测试框架提供隐式支持——只要测试使用为当前项目注册的 JUnit Platform TestEngine 运行。

  • 构建时 AOT 处理:当前项目中的每个独特的测试 ApplicationContext 都将 刷新以进行 AOT 处理

  • 运行时 AOT 支持:在 AOT 运行时模式下执行时,Spring 集成测试将使用一个 AOT 优化的 ApplicationContext,该 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 机制设置相同的属性。

在 AOT 模式下,JPA 的 @PersistenceContext@PersistenceUnit 注解不能用于在测试类中执行依赖注入。

但是,自 Spring Framework 7.0 起,您可以使用 @Autowired 而不是 @PersistenceContext@PersistenceUnit 分别将 EntityManagerEntityManagerFactory 注入到测试中。

在 AOT 模式下不支持 @ContextHierarchy 注解。

要为在 GraalVM 本机镜像中使用提供测试特定的运行时提示,您有以下选项。

TestRuntimeHintsRegistrar API 是核心 RuntimeHintsRegistrar API 的配套。如果您需要为不特定于特定测试类的测试支持注册全局提示,请优先实现 RuntimeHintsRegistrar 而不是测试特定的 API。

如果您实现自定义 ContextLoader,它必须实现 AotContextLoader 才能提供 AOT 构建时处理和 AOT 运行时执行支持。但是请注意,Spring Framework 和 Spring Boot 提供的所有上下文加载器实现都已经实现了 AotContextLoader

如果您实现自定义 TestExecutionListener,它必须实现 AotTestExecutionListener 才能参与 AOT 处理。请参阅 spring-test 模块中的 SqlScriptsTestExecutionListener 作为示例。

© . This site is unofficial and not affiliated with VMware.