Spring 单元测试核心注解全解:@InjectMocks、@MockBean、@Mock、@Autowired 的区别与实战_injectmocks和mock的区别
在编写 Spring Boot 应用的单元测试过程中,@InjectMocks
、@MockBean
、@Mock
和 @Autowired
是最常用的几个注解,但它们经常被混淆或误用,导致测试失败或注入错误。
本文将从本质区别、使用场景、示例代码、对比表格等多个维度,全面解析这几者的使用方法与差异,助你写出结构清晰、行为可控的单元测试。
一、核心区别概览
@Mock
@InjectMocks
@Mock
的对象注入到目标对象中@MockBean
@Autowired
二、使用场景详解
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