测试的提前支持

本章介绍了Spring对集成测试使用Spring TestContext框架的提前支持(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本机映像中启用或禁用测试。请注意,@DisabledInAotMode在GraalVM本机映像中运行时也会禁用带注解的测试类或测试方法,类似于JUnit Jupiter的@DisabledInNativeImage注解。

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

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

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

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

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

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

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

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