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

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

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

例如,TODAY Framework 提供了以下默认注册的 ContextCustomizerFactory 实现:

MockServerContainerContextCustomizerFactory

如果类路径中存在 WebSocket 支持,并且测试类或其封闭类之一标注或元标注了 @WebAppConfiguration,则创建 MockServerContainerContextCustomizerMockServerContainerContextCustomizer 实例化一个新的 MockServerContainer 并将其存储在 MockContextImpl 中,属性名为 jakarta.websocket.server.ServerContainer

注册 ContextCustomizerFactory 实现

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

自动发现默认 ContextCustomizerFactory 实现

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

例如,构成 TODAY Framework 和 Infra Boot 测试支持的模块在 META-INF/today.strategies 属性文件的 infra.test.context.ContextCustomizerFactory 键下声明了所有核心默认 ContextCustomizerFactory 实现。infra-test 模块的 today.strategies 文件可以在 这里 查看。第三方框架和开发人员可以通过他们自己的 today.strategies 文件以相同的方式将他们自己的 ContextCustomizerFactory 实现贡献给默认工厂列表。

合并 ContextCustomizerFactory 实现

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

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

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