当前位置: 首页 > news >正文

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

相关文章:

  • 关于字节跳动旗下的豆包(DouBao)软件的详解、核心功能以及与同类产品的对比分析
  • 【C/C++】深入理解整型截断与提升:原理、应用与区别
  • 【Linux网络】Socket 编程TCP
  • 第十六届蓝桥杯大赛软件赛省赛 Python 大学 B 组 满分题解
  • echo命令,tail命令,反引号,重定向符
  • PythonFlask打造高效流式接口的实战
  • SPI接口DAC设备驱动与应用程序开发
  • 面试求助:在性能测试中发现CPU占用过高应该如何进行分析?
  • 科普:如何通过ROC曲线,确定二分类的“理论阈值”
  • Golang|锁相关
  • Python——Matplotlib库的练习
  • HarmonyOS:使用Refresh组件实现页面下拉刷新上拉加载更多
  • 【蓝桥云课】男女搭配 python
  • c语言坦克对战(前言)
  • Rust编程学习(一): 变量与数据类型
  • 51单片机波特率与溢出率的关系
  • FinanceRAG获奖方案解读:ACM-ICAIF ’24的FinanceRAG挑战赛
  • Nacos深度剖析与实践应用 -1
  • 日志分析-mysql应急响应
  • 【网络原理】TCP/IP协议五层模型
  • “80后”德州市接待事务中心副主任刘巍“拟进一步使用”
  • 王毅谈中拉命运共同体建设“五大工程”及落实举措
  • 美国4月CPI同比上涨2.3%低于预期,为2021年2月来最小涨幅
  • 习近平致电祝贺阿尔巴尼斯当选连任澳大利亚总理
  • 世界期待中美对话合作带来更多确定性和稳定性
  • 中国潜水救捞行业协会发布《呵护潜水员职业健康安全宣言》