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

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属性文件中声明了所有核心默认的ContextCustomizerFactory实现,这些实现位于org.springframework.test.context.ContextCustomizerFactory键下。 spring-test模块的spring.factories文件可以在这里查看。第三方框架和开发人员可以通过自己的spring.factories文件以相同的方式向默认工厂列表中贡献自己的ContextCustomizerFactory实现。

合并ContextCustomizerFactory实现

如果通过@ContextCustomizerFactories注册了自定义ContextCustomizerFactory,它将与使用前述自动发现机制注册的默认工厂进行合并

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

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