Java SpringBoot中如何整合@ContextConfiguration与@SpringBootTest功能
问题根因
@SpringBootTest 本身是复合注解,已经集成了上下文配置能力,直接额外添加 @ContextConfiguration 注解时,默认配置下两者的上下文初始化逻辑会发生冲突,导致 Initializer 执行后的结果没有被合并到最终生效的 Spring 上下文中。另外你代码中的 webEnviroment 属于拼写错误,正确属性名为 webEnvironment,拼写错误会导致 web 环境配置不生效,也可能引发上下文异常。
解决方案
方案1:直接将配置合并到@SpringBootTest中(推荐)
@SpringBootTest 原生支持 locations、initializers 等原本属于 @ContextConfiguration 的属性,无需额外添加 @ContextConfiguration 注解,直接合并配置即可:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = App.class, // 直接在这里添加xml配置和初始化器 locations = "my.xml", initializers = MyTest.MockJee.class ) public abstract class MyAbstractTest { ... }
方案2:保留@ContextConfiguration,添加继承属性
如果你确实需要单独使用 @ContextConfiguration 注解,需要显式指定配置继承属性,保证初始化逻辑被正确合并:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = App.class) @ContextConfiguration( locations = "my.xml", initializers = MyTest.MockJee.class, // 开启配置继承,保证上下文逻辑合并 inheritLocations = true, inheritInitializers = true ) public abstract class MyAbstractTest { ... }
附加校验点
- 确认
MyTest.MockJee实现了ApplicationContextInitializer<ConfigurableApplicationContext>接口 - 确认 Initializer 中所有对上下文的修改操作都是基于接口传入的上下文对象执行,没有自行创建新的上下文实例
内容的提问来源于stack exchange,提问作者Yuri Molodyko
相关产品推荐
相关产品推荐

