SpringBootTest测试环境未加载@Component标注组件问题咨询
首先明确:这不是SpringBootTest的默认行为,默认情况下只要Bean被组件扫描到、且满足加载条件,测试启动时会和正式环境一样初始化所有非懒加载的单例Bean,不需要显式引用。你遇到的现象大概率是以下几种配置问题导致的:
1. 测试环境开启了全局懒加载
这是最符合你描述的场景:
- 正式环境配置没有开全局懒加载,启动时会主动初始化所有单例Bean,你的
DefaultEntityGenerator会被自动实例化,@PostConstruct方法正常执行 - 测试环境的
application-test.yml/properties里配置了spring.main.lazy-initialization=true,开启后所有Bean默认都是懒加载,只有被其他Bean引用、或者显式获取的时候才会实例化,因此你没有@Autowired的时候这个Bean不会被初始化。
验证方式:检查test环境配置文件中是否存在上述懒加载配置,如果有的话,要么关闭全局懒加载,要么给DefaultEntityGenerator类上加@Lazy(false)注解强制这个Bean不懒加载即可。
2. 组件扫描范围不匹配
正式环境启动时,主启动类的@SpringBootApplication注解默认会扫描所在包及所有子包下的组件。如果你的测试类所在的包路径和主启动类不一致,或者测试类上额外添加了带范围限定的@ComponentScan、@TestConfiguration等配置,可能导致DefaultEntityGenerator所在的包没有被纳入测试环境的组件扫描范围。
3. 类上存在条件注解限制了测试环境加载
检查DefaultEntityGenerator类上是否加了以下注解:
@Profile("!test"):明确指定不在test环境生效@ConditionalOnProperty、@ConditionalOnBean等条件注解:测试环境的配置或Bean缺失导致不满足加载条件
比如你如果给这个类加了@ConditionalOnBean(SpringLiquibase.class),而测试环境配置了spring.liquibase.enabled=false导致SpringLiquibase Bean没有注册,那这个类也不会被实例化。
4. 测试类指定了有限的classes加载范围
如果你的@SpringBootTest注解指定了classes参数,比如@SpringBootTest(classes = {ProductService.class}),那Spring只会初始化你指定的这些类相关的Bean,没有被指定的DefaultEntityGenerator自然不会被加载。
内容的提问来源于stack exchange,提问作者Kevin Day

