@MockBean标注的Bean是否在Spring上下文加载真实Bean前完成Mock?
关于@MockBean的Spring上下文加载逻辑
你的猜测完全正确!Spring在处理@MockBean注解时,不会先加载Foo类的真实Bean,而是直接创建并注册对应的Mock实例到Spring上下文里。
咱们来拆解一下背后的具体逻辑:
- 首先,
@MockBean是Spring Boot Test专门为测试场景提供的注解,核心作用就是替换或添加Mock类型的Bean。当Spring启动上下文扫描到这个注解时,会优先处理它:- 如果你的项目里已经有Foo类型的真实Bean(比如标注了
@Component或者在配置类里定义过),Spring会直接用Mock实例替换掉这个真实Bean; - 如果上下文里还没有Foo类型的Bean,Spring会直接把生成的Mock实例注册进去。
- 如果你的项目里已经有Foo类型的真实Bean(比如标注了
- 实现这个逻辑的关键是Spring Boot Test里的
MockBeanPostProcessor——它会在Bean创建的早期阶段就介入,拦截对应类型的Bean创建流程,转而调用Mockito生成Mock对象,跳过真实Bean的实例化步骤。 - 顺便提一句,你代码里写的
@Autowired @MockBean private Foo foobar;其实@Autowired是多余的,@MockBean本身就会自动把Mock实例注入到测试类的字段中,不过即使写了也不会有问题,Spring会正确处理。
内容的提问来源于stack exchange,提问作者JCB
相关产品推荐
相关产品推荐

