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

一个ContextCustomizer负责在将 Bean 定义加载到上下文中之后但上下文刷新之前自定义提供的ConfigurableApplicationContext

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

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

MockServerContainerContextCustomizerFactory

如果类路径中存在 WebSocket 支持并且测试类或其包含类之一使用@WebAppConfiguration进行注解或元注解,则创建MockServerContainerContextCustomizerMockServerContainerContextCustomizer实例化一个新的MockServerContainer并将其存储在ServletContext中,名称为jakarta.websocket.server.ServerContainer的属性下。

注册ContextCustomizerFactory实现

您可以通过使用@ContextCustomizerFactories注解为测试类、其子类及其嵌套类显式注册ContextCustomizerFactory实现。有关详细信息和示例,请参阅注解支持@ContextCustomizerFactories的 javadoc。

默认ContextCustomizerFactory实现的自动发现

使用@ContextCustomizerFactories注册ContextCustomizerFactory实现适用于在有限的测试场景中使用的自定义工厂。但是,如果自定义工厂需要在整个测试套件中使用,则可能会变得很麻烦。这个问题通过通过SpringFactoriesLoader机制支持自动发现默认ContextCustomizerFactory实现来解决。

例如,构成 Spring 框架和 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