此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

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

ContextCustomizer 负责在 bean 定义已加载到上下文中但上下文尚未刷新之前,对所提供的 ConfigurableApplicationContext 进行自定义。spring-doc.cadn.net.cn

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

例如,Spring Framework 提供了以下默认注册的 ContextCustomizerFactory 实现:spring-doc.cadn.net.cn

MockServerContainerContextCustomizerFactory

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

注册中ContextCustomizerFactory实现

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

自动发现默认配置ContextCustomizerFactory实现

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

例如,Spring Framework 和 Spring Boot 中构成测试支持的模块在其 ContextCustomizerFactory 属性文件中,均在 org.springframework.test.context.ContextCustomizerFactory 键下声明了所有核心默认的 META-INF/spring.factories 实现。可以在此处查看 spring-test 模块的 https://github.com/spring-projects/spring-framework/tree/7.0.x/spring-test/src/main/resources/META-INF/spring.factories 文件。 第三方框架和开发者也可以通过自己的 ContextCustomizerFactory 文件,以相同的方式向默认工厂列表中添加自己的 spring.factories 实现。spring-doc.cadn.net.cn

合并ContextCustomizerFactory实现

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

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

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