You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:00:01