测试的预先支持

本章介绍 Spring TestContext 框架在集成测试中对 Spring 预先 (AOT) 支持的功能。

此测试支持扩展了 Spring 的核心 AOT 支持,增加了以下功能。

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

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

  • 构建时 AOT 处理:当前项目中的每个唯一测试 `ApplicationContext` 都将进行 AOT 处理刷新。

  • 运行时 AOT 支持:在 AOT 运行时模式下执行时,Spring 集成测试将使用一个 AOT 优化后的 `ApplicationContext`,它能透明地参与到上下文缓存中。

默认情况下,在 AOT 模式下所有测试都是启用的。但是,你可以通过使用@DisabledInAotMode注解,在 AOT 模式下有选择地禁用整个测试类或单个测试方法。使用 JUnit Jupiter 时,你可以通过 Jupiter 的 @EnabledInNativeImage@DisabledInNativeImage 注解,有选择地在 GraalVM 原生镜像中启用或禁用测试。请注意,当在 GraalVM 原生镜像中运行时,@DisabledInAotMode 也将禁用被注解的测试类或测试方法,类似于 JUnit Jupiter 的 @DisabledInNativeImage 注解。

默认情况下,如果在构建时 AOT 处理期间遇到错误,将抛出异常,并且整个过程会立即失败。

如果你希望构建时 AOT 处理在遇到错误后继续进行,可以禁用 failOnError 模式,这将导致错误以 WARN 级别记录,或者在 DEBUG 级别记录更详细的信息。

可以通过命令行或构建脚本设置名为 spring.test.aot.processing.failOnError 的 JVM 系统属性为 false 来禁用 failOnError 模式。作为替代方案,你也可以通过SpringProperties机制设置相同的属性。

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

要在 GraalVM 原生镜像中为测试提供特定的运行时提示,你有以下选项。

TestRuntimeHintsRegistrar API 是核心 RuntimeHintsRegistrar API 的一个补充。如果你需要注册不针对特定测试类的全局测试支持提示,建议实现 RuntimeHintsRegistrar 而不是测试特定的 API。

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

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