測試的預先支援

本章介紹 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 作為示例。