使用上下文定制器进行上下文配置
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
,它将与使用上述 自动发现机制 注册的默认工厂合并。
合并算法确保从列表中删除重复项,并在合并时将本地声明的工厂追加到默认工厂列表中。
要替换测试类、其子类及其嵌套类的默认工厂,可以将 |