測試的預先 (Ahead of Time) 支援

本章涵蓋 Spring 的預先 (Ahead of Time, AOT) 支援,用於使用 Spring TestContext 框架的整合測試。

此測試支援透過以下功能擴展 Spring 的核心 AOT 支援

  • 在目前專案中建置時偵測所有使用 TestContext 框架載入 ApplicationContext 的整合測試。

    • 為基於 JUnit Jupiter 和 JUnit 4 的測試類別提供明確的支援,以及為 TestNG 和其他使用 Spring 核心測試註解的測試框架提供隱含的支援 — 只要測試是使用已為目前專案註冊的 JUnit Platform TestEngine 執行即可。

  • 建置時 AOT 處理:目前專案中的每個唯一測試 ApplicationContext 都將重新整理以進行 AOT 處理

  • 執行階段 AOT 支援:在 AOT 執行階段模式下執行時,Spring 整合測試將使用 AOT 優化的 ApplicationContext,該容器與context 快取透明地協作。

預設情況下,所有測試都在 AOT 模式下啟用。但是,您可以透過使用 @DisabledInAotMode 註解來選擇性地停用整個測試類別或個別測試方法在 AOT 模式下的執行。當使用 JUnit Jupiter 時,您可以透過 Jupiter 的 @EnabledInNativeImage@DisabledInNativeImage 註解,選擇性地在 GraalVM native image 中啟用或停用測試。請注意,當在 GraalVM native image 中執行時,@DisabledInAotMode 也會停用已註解的測試類別或測試方法,這與 JUnit Jupiter 的 @DisabledInNativeImage 註解類似。

預設情況下,如果在建置時 AOT 處理期間遇到錯誤,將會拋出例外,且整體流程將立即失敗。

如果您希望在遇到錯誤後繼續進行建置時 AOT 處理,您可以停用 failOnError 模式,這會導致錯誤記錄在 WARN 層級,或在 DEBUG 層級記錄更詳細的資訊。

可以從命令列或建置腳本停用 failOnError 模式,方法是將名為 spring.test.aot.processing.failOnError 的 JVM 系統屬性設定為 false。或者,您可以透過 SpringProperties 機制設定相同的屬性。

AOT 模式下不支援 @ContextHierarchy 註解。

為了為 GraalVM native image 中的使用提供測試特定的執行階段提示,您有以下選項。

TestRuntimeHintsRegistrar API 作為核心 RuntimeHintsRegistrar API 的配套。如果您需要註冊不特定於特定測試類別的測試支援的全域提示,請優先實作 RuntimeHintsRegistrar 而不是測試特定的 API。

如果您實作自訂 ContextLoader,它必須實作 AotContextLoader,以便提供 AOT 建置時處理和 AOT 執行階段執行支援。但是請注意,Spring Framework 和 Spring Boot 提供的所有 context loader 實作都已實作 AotContextLoader

如果您實作自訂 TestExecutionListener,它必須實作 AotTestExecutionListener,以便參與 AOT 處理。有關範例,請參閱 spring-test 模組中的 SqlScriptsTestExecutionListener