使用上下文自定义器进行上下文配置
ContextCustomizer 负责在 Bean 定义加载到上下文中之后、但在上下文被刷新之前,对提供的 ConfigurableApplicationContext 进行自定义。
ContextCustomizerFactory 负责根据某些自定义逻辑创建 ContextCustomizer,这些逻辑用于判断给定的测试类是否需要 ContextCustomizer——例如,基于某个特定注解的存在。在 ContextLoaders 处理完测试类的上下文配置属性之后,但在创建 MergedContextConfiguration 之前,会调用这些工厂(factories)。
例如,Spring框架提供了以下默认注册的ContextCustomizerFactory实现:
MockServerContainerContextCustomizerFactory
如果在类路径中存在WebSocket支持,并且测试类或其嵌套类之一被标注或元标注了@WebAppConfiguration,则创建一个MockServerContainerContextCustomizer。MockServerContainerContextCustomizer会实例化一个新的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 文件可以在这里查看:[https://github.com/spring-projects/spring-framework/tree/main/spring-test/src/main/resources/META-INF/spring.factories》。第三方框架和开发者也可以通过他们自己的 spring.factories 文件,以同样的方式将自己的 ContextCustomizerFactory 实现添加到默认工厂的列表中。
合并ContextCustomizerFactory实现
如果通过 @ContextCustomizerFactories 注册了自定义的 ContextCustomizerFactory,它将会与使用上述自动发现机制注册的默认工厂合并。
合并算法确保列表中的重复项被删除,并在合并过程中将本地声明的工厂添加到默认工厂列表中。
要替换测试类、其子类及其嵌套类的默认工厂,可以将@ContextCustomizerFactories的mergeMode属性设置为MergeMode.REPLACE_DEFAULTS。