必须在真实Spring上下文中运行@SpringBootTest测试才能验证@ConditionalOnProperty等条件注解是否生效,仅用普通JUnit@Test无法触发条件判断;需引入spring-boot-starter-test依赖,编写带条件注解的配置类,并通过ApplicationContext检查Bean存在性来断言条件逻辑。

要验证SpringBoot中@ConditionalOnProperty、@ConditionalOnClass等条件注解是否按预期生效,必须在真实Spring上下文中运行测试,仅用普通JUnit@Test无法触发条件判断逻辑。
确认测试依赖已就位
检查pom.xml中是否包含spring-boot-starter-test且scope为test:
【缺少该依赖会导致@SpringBootTest无法解析,直接报ClassNotFoundException】
编写带条件的配置类
在src/main/java下新建一个被测类,例如:
@Configuration
public class ConditionalConfig {
@Bean
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
public FeatureService featureService() {
return new FeatureService();
}
}
这一步必须完成,否则后续测试无目标可验证。
将 Spring Boot 2.7 项目升级到 Spring Boot 3.5 的实战流程,覆盖版本基线、依赖坐标替换、Jakarta 迁移、配置兼容、异步上下文传递改造与验证门禁。用于企业多模块 Maven 项目升级与排障。
用@SpringBootTest加载完整上下文
方法一:默认加载全部配置(推荐初试)
① 在test目录下新建类,添加@SpringBootTest注解;
② 不指定classes参数,让Spring Boot自动扫描启动类及全部配置;
③ 使用ApplicationContext.getBeanNamesForType(FeatureService.class)检查Bean是否存在。
方法二:精准控制加载范围
使用@SpringBootTest(classes = {ConditionalConfig.class, TestApplication.class})显式指定配置类和启动类,避免其他配置干扰判断。
注意:若项目结构中启动类与测试类不在同一包或子包下,【必须显式通过classes参数传入启动类,否则@SpringBootTest找不到@SpringBootConfiguration】。
断言条件是否触发
第一步:注入ApplicationContext
@Autowired
private ApplicationContext context;
第二步:检查Bean注册状态
String[] names = context.getBeanNamesForType(FeatureService.class);
assertThat(names).hasSize(1); // 条件满足时存在
第三步:切换application.yml中feature.enabled: false后重跑,此时names应为空数组。这一步验证了条件注解的动态响应能力,不是静态编译检查。

















