Spring 单元测试核心注解全解:@InjectMocks、@MockBean、@Mock、@Autowired 的区别与实战
在编写 Spring Boot 应用的单元测试过程中,@InjectMocks
、@MockBean
、@Mock
和 @Autowired
是最常用的几个注解,但它们经常被混淆或误用,导致测试失败或注入错误。
本文将从本质区别、使用场景、示例代码、对比表格等多个维度,全面解析这几者的使用方法与差异,助你写出结构清晰、行为可控的单元测试。
一、核心区别概览
注解 | 所属体系 | 作用说明 |
---|---|---|
@Mock |
Mockito | 创建一个 Mock 对象(不进入 Spring 容器) |
@InjectMocks |
Mockito | 将 @Mock 的对象注入到目标对象中 |
@MockBean |
Spring Boot | 将 Spring 容器中的某个 Bean 替换成 Mock 对象 |
@Autowired |
Spring Framework | 从 Spring 容器中获取真实 Bean 实例 |
二、使用场景详解
1. @Mock
:创建独立的模拟对象
适用于测试工具类、Service、非容器内对象,搭配 Mockito 使用:
@ExtendWith(MockitoExtension.class)
class MyServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private MyService myService;
@Test
void testFind() {
when(userRepository.findById(1L)).thenReturn(Optional.of(new User()));
assertNotNull(myService.getUserById(1L));
}
}
2. @InjectMocks
:将 @Mock
注入目标类
比如我们有个OrderController,在 OrderController 中,我们用到了OrderService
class OrderController{
private OrderService orderService;
public OrderController(OrderSerice orderService){
this.orderService = orderService;
}
}
用于将上面创建的 @Mock
模拟对象注入到被测试类中,支持构造函数、字段、Setter 注入。