测试的提前支持

本章介绍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机制设置相同的属性。

AOT模式不支持@ContextHierarchy注解。

要为在GraalVM原生镜像中使用提供特定于测试的运行时提示,您可以选择以下选项。

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

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

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