跳到主要内容

配置 使用上下文定制器进行配置

DeepSeek V3 中英对照 Configuration Configuration with Context Customizers

ContextCustomizer 负责在将 bean 定义加载到上下文之后,但在上下文刷新之前,对提供的 ConfigurableApplicationContext 进行自定义。

ContextCustomizerFactory 负责根据一些自定义逻辑创建 ContextCustomizer,该逻辑决定了是否需要对给定的测试类使用 ContextCustomizer —— 例如,基于某个特定注解的存在。工厂在 ContextLoaders 处理完测试类的上下文配置属性之后、但在创建 MergedContextConfiguration 之前被调用。

例如,Spring Framework 提供了以下默认注册的 ContextCustomizerFactory 实现:

MockServerContainerContextCustomizerFactory

如果类路径中存在 WebSocket 支持,并且测试类或其封闭类之一被 @WebAppConfiguration 注解或元注解标注,则创建一个 MockServerContainerContextCustomizerMockServerContainerContextCustomizer 会实例化一个新的 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,它将与通过上述自动发现机制注册的默认工厂合并

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

提示

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