Ahead of Time Support for Tests

This chapter covers Spring’s Ahead of Time (AOT) support for integration tests using the Spring TestContext Framework.spring-doc.cn

The testing support extends Spring’s core AOT support with the following features.spring-doc.cn

  • Build-time detection of all integration tests in the current project that use the TestContext framework to load an ApplicationContext.spring-doc.cn

    • Provides explicit support for test classes based on JUnit Jupiter and JUnit 4 as well as implicit support for TestNG and other testing frameworks that use Spring’s core testing annotations — as long as the tests are run using a JUnit Platform TestEngine that is registered for the current project.spring-doc.cn

  • Build-time AOT processing: each unique test ApplicationContext in the current project will be refreshed for AOT processing.spring-doc.cn

  • Runtime AOT support: when executing in AOT runtime mode, a Spring integration test will use an AOT-optimized ApplicationContext that participates transparently with the context cache.spring-doc.cn

All tests are enabled in AOT mode by default. However, you can selectively disable an entire test class or individual test method in AOT mode by annotating it with @DisabledInAotMode. When using JUnit Jupiter, you may selectively enable or disable tests in a GraalVM native image via Jupiter’s @EnabledInNativeImage and @DisabledInNativeImage annotations. Note that @DisabledInAotMode also disables the annotated test class or test method when running within a GraalVM native image, analogous to JUnit Jupiter’s @DisabledInNativeImage annotation.spring-doc.cn

By default, if an error is encountered during build-time AOT processing, an exception will be thrown, and the overall process will fail immediately.spring-doc.cn

If you would prefer that build-time AOT processing continue after errors are encountered, you can disable the failOnError mode which results in errors being logged at WARN level or with greater detail at DEBUG level.spring-doc.cn

The failOnError mode can be disabled from the command line or a build script by setting a JVM system property named spring.test.aot.processing.failOnError to false. As an alternative, you can set the same property via the SpringProperties mechanism.spring-doc.cn

The @ContextHierarchy annotation is not supported in AOT mode.spring-doc.cn

To provide test-specific runtime hints for use within a GraalVM native image, you have the following options.spring-doc.cn

The TestRuntimeHintsRegistrar API serves as a companion to the core RuntimeHintsRegistrar API. If you need to register global hints for testing support that are not specific to particular test classes, favor implementing RuntimeHintsRegistrar over the test-specific API.spring-doc.cn

If you implement a custom ContextLoader, it must implement AotContextLoader in order to provide AOT build-time processing and AOT runtime execution support. Note, however, that all context loader implementations provided by the Spring Framework and Spring Boot already implement AotContextLoader.spring-doc.cn

If you implement a custom TestExecutionListener, it must implement AotTestExecutionListener in order to participate in AOT processing. See the SqlScriptsTestExecutionListener in the spring-test module for an example.spring-doc.cn