使用 Context Customizer 進行上下文配置
一個 ContextCustomizer
負責在 bean 定義載入到上下文之後、上下文重新整理之前,定製提供的 ConfigurableApplicationContext
。
一個 ContextCustomizerFactory
負責根據一些自定義邏輯建立 ContextCustomizer
,這些邏輯決定了某個 ContextCustomizer
對於給定的測試類是否必要——例如,基於是否存在特定註解。工廠在 ContextLoader
為測試類處理完上下文配置屬性之後,但在建立 MergedContextConfiguration
之前被呼叫。
例如,Spring Framework 提供以下預設註冊的 ContextCustomizerFactory
實現
MockServerContainerContextCustomizerFactory
-
如果在類路徑中存在 WebSocket 支援,並且測試類或其封閉類之一被 `@WebAppConfiguration` 註解或元註解,則建立一個
MockServerContainerContextCustomizer
。MockServerContainerContextCustomizer
例項化一個新的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` 的 |