未注册为Spring Bean的测试类中,能否使用@Autowired注解?
问题解答
为什么你的测试类里@Autowired能生效,但从ApplicationContext拿不到这个类的Bean?
- 你的测试类
MockingTest加了@SpringBootTest注解,Spring Test框架会针对测试类做特殊处理:它会启动Spring上下文,然后直接从上下文里取出匹配的Bean,赋值给测试类的@Autowired字段——这个过程不需要把测试类本身注册成Spring Bean。 - 正因为测试类没被注册为Bean,所以你调用
context.getBean(MockingTest.class)时,Spring容器里根本没有这个类的Bean定义,自然会提示不存在。
能不能在不将类注册为Spring Bean的情况下使用@Autowired?
分两种场景:
- 测试类场景:可以。Spring Test框架(包括
@SpringBootTest、@WebMvcTest等测试注解)专门做了适配,允许在非Bean的测试类中使用@Autowired、@MockBean等注解,框架会负责完成字段的注入逻辑。 - 业务类场景:不行。
@Autowired的常规注入逻辑依赖Spring容器对Bean的生命周期管理,只有被Spring容器管理的Bean(比如加了@Component、@Service、@Repository等注解,或者通过配置类注册的Bean),Spring才会处理其内部的@Autowired字段注入。非Bean类的@Autowired字段Spring不会识别,也不会自动注入。
补充说明你的代码
你代码里的@Mock和@InjectMocks是Mockito的注解,和Spring无关——Mockito会负责创建Mock实例,并把Mock注入到@InjectMocks标注的对象里,这个过程也不需要Spring参与。
内容的提问来源于stack exchange,提问作者fast
相关产品推荐
相关产品推荐

