使用 Context Customizer 進行上下文配置

一個 ContextCustomizer 負責在 bean 定義載入到上下文之後、上下文重新整理之前,定製提供的 ConfigurableApplicationContext

一個 ContextCustomizerFactory 負責根據一些自定義邏輯建立 ContextCustomizer,這些邏輯決定了某個 ContextCustomizer 對於給定的測試類是否必要——例如,基於是否存在特定註解。工廠在 ContextLoader 為測試類處理完上下文配置屬性之後,但在建立 MergedContextConfiguration 之前被呼叫。

例如,Spring Framework 提供以下預設註冊的 ContextCustomizerFactory 實現

MockServerContainerContextCustomizerFactory

如果在類路徑中存在 WebSocket 支援,並且測試類或其封閉類之一被 `@WebAppConfiguration` 註解或元註解,則建立一個 MockServerContainerContextCustomizerMockServerContainerContextCustomizer 例項化一個新的 MockServerContainer 並將其儲存在 ServletContext 中,屬性名稱為 jakarta.websocket.server.ServerContainer

註冊 ContextCustomizerFactory 實現

您可以使用 `@ContextCustomizerFactories` 註解為測試類、其子類及其巢狀類顯式註冊 ContextCustomizerFactory 實現。有關詳細資訊和示例,請參閱註解支援@ContextCustomizerFactories 的 Javadoc。

預設 ContextCustomizerFactory 實現的自動發現

使用 `@ContextCustomizerFactories` 註冊 ContextCustomizerFactory 實現適用於在有限測試場景中使用的自定義工廠。然而,如果自定義工廠需要在整個測試套件中使用,這可能會變得繁瑣。這個問題透過支援使用 SpringFactoriesLoader 機制自動發現預設 ContextCustomizerFactory 實現來解決。

例如,構成 Spring Framework 和 Spring Boot 測試支援的模組在其 META-INF/spring.factories 屬性檔案中,在 org.springframework.test.context.ContextCustomizerFactory 鍵下宣告所有核心預設 ContextCustomizerFactory 實現。spring-test 模組的 spring.factories 檔案可以在這裡檢視。第三方框架和開發者可以透過他們自己的 spring.factories 檔案,以同樣的方式將自己的 ContextCustomizerFactory 實現貢獻到預設工廠列表中。

ContextCustomizerFactory 實現的合併

如果自定義的 ContextCustomizerFactory 透過 `@ContextCustomizerFactories` 註冊,它將與使用上述自動發現機制註冊的預設工廠合併。

合併演算法確保從列表中移除重複項,並在合併時將本地宣告的工廠附加到預設工廠列表中。

要替換測試類、其子類及其巢狀類的預設工廠,可以將 `@ContextCustomizerFactories` 的 mergeMode 屬性設定為 MergeMode.REPLACE_DEFAULTS