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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值