在編寫 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 注入。