> 技术文档 > Spring 单元测试核心注解全解:@InjectMocks、@MockBean、@Mock、@Autowired 的区别与实战_injectmocks和mock的区别

Spring 单元测试核心注解全解:@InjectMocks、@MockBean、@Mock、@Autowired 的区别与实战_injectmocks和mock的区别

在编写 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 模拟对象注入到被测试类中,支持构造函数、字段、Set