Configuration Configuration with Context Customizers

ContextCustomizer 负责在 Bean 定义已加载到上下文中,但在上下文已刷新之前,自定义提供的 ConfigurableApplicationContextContextCustomizerFactory 负责创建 ContextCustomizer ,它基于一些自定义逻辑来确定 ContextCustomizer 是否对于给定的测试类是必要的——例如,基于某个注释的存在。在 ContextLoaders 处理了测试类的上下文配置属性后,但在创建 MergedContextConfiguration 之前,便会调用工厂。 例如,Spring Framework 提供以下 ContextCustomizerFactory,默认情况下已注册该实现: MockServerContainerContextCustomizerFactory:: Creates a MockServerContainerContextCustomizer if WebSocket support is present in the classpath and the test class or one of its enclosing classes is annotated or meta-annotated with @WebAppConfiguration. MockServerContainerContextCustomizer instantiates a new MockServerContainer and stores it in the ServletContext under the attribute named jakarta.websocket.server.ServerContainer.

Registering ContextCustomizerFactory Implementations

你可以显式地为测试类及其子类和嵌套类注册 ContextCustomizerFactory 实现,方法是使用 @ContextCustomizerFactories 注释。请参见 annotation support@ContextCustomizerFactories 的 javadoc 以获取详细信息和示例。

Automatic Discovery of Default ContextCustomizerFactory Implementations

使用 @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 实现。

Merging ContextCustomizerFactory Implementations

如果通过 @ContextCustomizerFactories 注册了自定义`ContextCustomizerFactory` ,则它将通过使用上述automatic discovery mechanism 注册的默认工厂进行_merged_ 。

合并算法确保从列表中删除重复项,并在合并时将本地声明的工厂附加到默认工厂列表中。

要替换测试类、其子类和嵌套类的默认工厂,可以将 @ContextCustomizerFactoriesmergeMode 属性设置为 MergeMode.REPLACE_DEFAULTS