配置 使用上下文定制器进行配置
ContextCustomizer
负责在将 bean 定义加载到上下文之后,但在上下文刷新之前,对提供的 ConfigurableApplicationContext
进行自定义。
ContextCustomizerFactory
负责根据一些自定义逻辑创建 ContextCustomizer
,该逻辑决定了是否需要对给定的测试类使用 ContextCustomizer
—— 例如,基于某个特定注解的存在。工厂在 ContextLoaders
处理完测试类的上下文配置属性之后、但在创建 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
实现
如果通过 @ContextCustomizerFactories
注册了自定义的 ContextCustomizerFactory
,它将与通过上述自动发现机制注册的默认工厂合并。
合并算法确保从列表中删除重复项,并且在合并时将本地声明的工厂附加到默认工厂列表中。
要替换测试类、其子类及其嵌套类的默认工厂,可以将 @ContextCustomizerFactories
的 mergeMode
属性设置为 MergeMode.REPLACE_DEFAULTS
。