对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

使用上下文自定义器进行上下文配置

在将 Bean 定义加载到上下文之后,但在刷新上下文之前,ContextCustomizer 负责自定义提供的 ConfigurableApplicationContextspring-doc.cadn.net.cn

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

例如,Spring 框架提供了以下 ContextCustomizerFactory 实现,默认情况下会注册该实现:spring-doc.cadn.net.cn

MockServerContainerContextCustomizerFactory

如果类路径中存在 WebSocket 支持,并且测试类或其任意外部类被注解或元注解了 @WebAppConfiguration,则会创建一个 MockServerContainerContextCustomizerMockServerContainerContextCustomizer 会实例化一个新的 MockServerContainer 并将其存储在 ServletContext 中,属性名为 jakarta.websocket.server.ServerContainerspring-doc.cadn.net.cn

注册 ContextCustomizerFactory 个实现

您可以使用 @ContextCustomizerFactories 注解为测试类、其子类和嵌套类显式注册 ContextCustomizerFactory 个实现。请参阅 注解支持@ContextCustomizerFactories 的 javadoc 以获取详细信息和示例。spring-doc.cadn.net.cn

自动发现默认的ContextCustomizerFactory实现

通过使用 @ContextCustomizerFactories 注册 ContextCustomizerFactory 实现适用于在有限测试场景中使用的自定义工厂。但是,如果需要在整个测试套件中使用自定义工厂,则可能会变得繁琐。此问题通过支持利用 SpringFactoriesLoader 机制自动发现默认的 ContextCustomizerFactory 实现来解决。spring-doc.cadn.net.cn

例如,构成 Spring Framework 和 Spring Boot 中测试支持的模块,会在其 META-INF/spring.factories 属性文件中的 org.springframework.test.context.ContextCustomizerFactory 键下列出所有核心默认的 ContextCustomizerFactory 实现。spring-test 模块的 spring.factories 文件可以在此查看。 第三方框架和开发者可以通过他们自己的 spring.factories 文件,以相同的方式向默认工厂列表贡献他们自己的 ContextCustomizerFactory 实现。spring-doc.cadn.net.cn

合并 ContextCustomizerFactory 个实现方案

如果通过 @ContextCustomizerFactories 注册了自定义的 ContextCustomizerFactory,它将与使用上述自动发现机制注册的默认工厂进行合并spring-doc.cadn.net.cn

合并算法确保从列表中移除重复项,并在合并时将本地声明的工厂追加到默认工厂列表的末尾。spring-doc.cadn.net.cn

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