ConditionalOnProperty(mock模式)未生效:Mock对象未被注入
解决Spring测试模式下Mock Bean未生效的问题
你的问题核心是同类型的StripeCustomerService存在两个Bean定义(真实@Service和配置类中的Mock Bean),Spring默认优先选择了真实实现类。以下是几种可行的解决办法:
1. 给Mock Bean添加@Primary注解
当同类型存在多个Bean时,@Primary会让Spring优先注入标注了该注解的Bean。修改你的配置类:
@Configuration public class StripeConfig { @Bean @ConditionalOnProperty(prefix="stripe", name="service", havingValue="mock") @Primary public StripeCustomerService mockStripeCustomerService() { return Mockito.mock(StripeCustomerService.class); } }
这样当stripe.service=mock条件满足时,Mock Bean会被优先选中注入到UserService中。
2. 让真实Service在Mock模式下不注册
通过反向条件控制真实Service的注册时机,确保Mock模式下只有Mock Bean存在。修改真实的StripeCustomerService实现类:
@Service @ConditionalOnProperty(prefix="stripe", name="service", havingValue="real", matchIfMissing = true) public class StripeCustomerServiceImpl implements StripeCustomerService { // 真实业务逻辑代码 }
这个配置表示:只有当stripe.service=real或者该属性不存在时,真实Service才会被注册。当stripe.service=mock时,真实Service不会被创建,自然只会注入Mock Bean。
3. 使用Profile区分环境
通过Spring的Profile机制,给真实Service和Mock Bean分别指定生效的环境:
- 真实Service类:
@Service @Profile("!mock") public class StripeCustomerServiceImpl implements StripeCustomerService { // 实现代码 }
- Mock Bean配置类:
@Configuration @Profile("mock") public class StripeConfig { @Bean public StripeCustomerService mockStripeCustomerService() { return Mockito.mock(StripeCustomerService.class); } }
然后在配置文件中添加spring.profiles.active=mock即可启用Mock模式。
额外排查点
确认你的配置文件中stripe.service=mock确实生效了,可以通过打印Environment中的属性值,或者查看Spring启动日志里的Bean注册信息,验证条件是否被正确触发。
内容的提问来源于stack exchange,提问作者Laucer
相关产品推荐
相关产品推荐

