在编写 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 {@Mockprivate UserRepository userRepository;@InjectMocksprivate MyService myService;@Testvoid 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 注入。