使用 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` 的 |