使用 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
属性文件中,将所有核心默认 ContextCustomizerFactory
实现声明在
org.springframework.test.context.ContextCustomizerFactory
键下。
spring-test
模块的 spring.factories
文件可以在
这里
查看。第三方框架和开发人员可以通过他们自己的 spring.factories
文件以相同的方式将他们自己的 ContextCustomizerFactory
实现贡献到默认工厂列表中。
合并 ContextCustomizerFactory
实现
如果一个自定义的 ContextCustomizerFactory
通过 @ContextCustomizerFactories
注册,它将与通过上述
自动发现机制注册的默认工厂_合并_。
合并算法确保从列表中移除重复项,并在合并时将本地声明的工厂附加到默认工厂列表的末尾。
要替换测试类、其子类及其嵌套类的默认工厂,可以将 |