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

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

在编写 Spring Boot 应用的单元测试过程中,@InjectMocks@MockBean@Mock@Autowired 是最常用的几个注解,但它们经常被混淆或误用,导致测试失败或注入错误。

本文将从本质区别、使用场景、示例代码、对比表格等多个维度,全面解析这几者的使用方法与差异,助你写出结构清晰、行为可控的单元测试。


一、核心区别概览

注解所属体系作用说明
@MockMockito创建一个 Mock 对象(不进入 Spring 容器)
@InjectMocksMockito@Mock 的对象注入到目标对象中
@MockBeanSpring Boot将 Spring 容器中的某个 Bean 替换成 Mock 对象
@AutowiredSpring 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 注入。

相关文章:

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

在编写 Spring Boot 应用的单元测试过程中,@InjectMocks、@MockBean、@Mock 和 @Autowired 是最常用的几个注解,但它们经常被混淆或误用,导致测试失败或注入错误。 本文将从本质区别、使用场景、示例代码、对比表格等多个维度,全面解析这几者的使用方法与差异,助你写出结…...

2025年大一训练-DP1

2025年大一训练-DP1 Problem A: 动态规划算法&#xff0c;从上往下一层层找到到达对应位置的最大值&#xff0c;最底下一行maxl的最大值即为答案 #include<bits/stdc.h> using namespace std; int lst[101][101]; int maxl[101][101];int main() {int n,i,j;while(cin&g…...

【java 13天进阶Day04】常用API、正则表达式,泛型、Collection集合API

Math类的使用。 Math用于做数学运算。Math类中的方法全部是静态方法&#xff0c;直接用类名调用即可。方法&#xff1a; public static int abs(int a) 获取参数a的绝对值public static double ceil(double a) 向上取整public static double floor(double a) 向下取整public s…...

conversation_template | conversation_actors | conversation_line_template

目录 conversation_template conversation_actors conversation_line_template 实例应用 conversation_template id&#xff1a;某段谈话的唯一编号FirstLineId&#xff1a;谈话开始的第一段话的编号&#xff0c;取值来源 ConversationLine.db2 的 ID 字段TextureKitId&am…...

架构图--架构师的行军地图

架构图是架构师最重要的沟通和规划工具之一&#xff0c;它如同行军地图般指导着整个软件系统的构建与演进。本文系统性地探讨了软件架构图设计的全面方法论&#xff0c;提出横向与纵向双维度的设计框架。横向设计关注模块间的业务、数据与重要性关系&#xff0c;纵向设计则采用…...

`get_peft_model` 是 `peft` 库什么方法

get_peft_model 是 peft 库什么方法 get_peft_model 是 peft 库中一个关键的方法,其作用是将 LoRA 配置应用到预训练模型上,使得模型能够使用 LoRA 技术进行高效微调。 整体逻辑概述 get_peft_model 方法的核心任务是遍历预训练模型的各个模块,识别出需要应用 LoRA 的目标…...

OpenHarmony-Risc-V上运行openBLAS中的benchmark

OpenHarmony-Risc-V上运行openBLAS中的benchmark 文章目录 OpenHarmony-Risc-V上运行openBLAS中的benchmark前言一、编译openBLAS1.源码下载2.工具链下载3.编译并安装openBLAS 二、编译open BLAS中的benchmark三、上设备运行总结 前言 参考https://zhuanlan.zhihu.com/p/18825…...

HAL库通过FATFS和SDIO+DMA写入SD卡数据错误

HAL库F4版本 1.28.1 最近在使用HAL库配置SDIODMA并通过FATFS向SD卡写入数据&#xff0c;但是发现写入的数据经常有错误&#xff0c;不是少了一部分就是多了一部分&#xff0c;写入的数据为csv格式&#xff0c;通过循环向缓冲区写入"100100,12.345678\r\n"数据来观察问…...

深入解析 Python 中的装饰器 —— 从基础到实战

1. 装饰器基础 1.1 什么是装饰器&#xff1f; 装饰器本质上是一个 Python 函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象。 1.2 语法糖&#xff1a; 符号 Python 提供了 符号作为装饰器的语法糖&#xff0c…...

【Java并发】Java并发编程之CountDownLatch详解:原理、使用场景与代码实战

摘要 在Java多线程编程中&#xff0c;CountDownLatch 是一个强大的同步工具类&#xff0c;用于协调多个线程的执行顺序&#xff0c;线程间的同步是一个常见的需求。CountDownLatch 作为 java.util.concurrent 包中的一个同步辅助类&#xff0c;提供了一种简单而有效的方式来实…...

python-图片分割

图片分割是图像处理中的一个重要任务&#xff0c;它的目标是将图像划分为多个区域或者对象&#xff0c;例如分割出物体、前景背景或特定的部分。在 Python 中&#xff0c;常用的图片分割方法包括传统的图像处理技术&#xff08;例如阈值分割、区域生长等&#xff09;和深度学习…...

江湖路远,唯PUT可稳:Express 路由更新招式全解

前言 江湖传闻,后端开发如同修炼绝世武功:有人精通 POST 掌,横扫千军;有人修习 GET 指法,探查万象。而真正踏入高阶境界的高手,常常默默修炼一门冷门却威力极强的秘技,PUT 神功。 今日时机正好,你我相逢于码海江湖,不如来一场技术切磋,也许能悟出更新之道,功力再上…...

MySQL:Join连接的原理

连接查询的执行过程&#xff1a; 确定第一个需要查询的表【驱动表】 选取代价最小的访问方法去执行单表查询语句 从驱动表每获取到一条记录&#xff0c;都需要到t2表中查找匹配的记录 两表连接查询需要查询一次t1表&#xff0c;两次t2表&#xff0c;在两表的连接查询中&…...

2025.04.14【Table】| 生信数据表图技巧

Custom title A set of examples showing how to customize the titles of a table made with GT Custom footer How to customize the footer and the references section of a gt table 文章目录 Custom titleCustom footer 生信数据可视化&#xff1a;Table图表详解1. R语…...

方案解读:虚拟电厂标杆项目整体建设方案【附全文阅读】

在电力市场背景下,传统电力现货市场存在电能定价不合理、分布式电源并网困难等问题。本虚拟电厂标杆项目旨在研究全时间尺度虚拟电厂智能管控关键技术,通过研制虚拟电厂控制器样机、开发运行管理平台,实现对分布式能源的合理优化配置。项目内容涵盖虚拟调控、建设目标、建设…...

使用Trae CN分析项目架构

架构分析后的截图 A区是打开的项目、B区是源码区、C区是AI给出当前项目的架构分析结果。 如何用 Trae CN 快速学习 STM32 嵌入式项目架构 在嵌入式开发领域&#xff0c;快速理解现有项目的架构是一项关键技能。Trae CN 作为一款强大的分析工具&#xff0c;能帮助开发者高效剖…...

【Python3】Django 学习之路

第一章&#xff1a;Django 简介 1.1 什么是 Django&#xff1f; Django 是一个高级的 Python Web 框架&#xff0c;旨在让 Web 开发变得更加快速和简便。它鼓励遵循“不要重复自己”&#xff08;DRY&#xff0c;Don’t Repeat Yourself&#xff09;的原则&#xff0c;并提供了…...

浏览器缩放后 element ui组件偏移

一、需求&#xff1a;当body的有了zoom值之后&#xff0c;element ui相关的popper弹框&#xff08;下拉框、日期选择框、分页组件&#xff09;位置都会出现偏移问题 二、问题来源 popper弹框都会需要根据屏幕x,y的坐标来设置位置&#xff0c;但是有了zoom值之后&#xff0c;x,y…...

FPGA学习——DE2-115开发板上设计波形发生器

1. 实验目的 掌握直接数字频率合成&#xff08;DDS&#xff09;技术的基本原理和应用。使用DE2-115开发板实现正弦波和方波的生成。使用SignalTap II嵌入式逻辑分析仪测试输出波形的离散数据。 2. 实验原理 DDS技术&#xff1a;通过相位累加器生成相位信息&#xff0c;结合波…...

Next.js 技术详解:构建现代化 Web 应用的全栈框架

1. Next.js 概述 Next.js 是一个基于 React 的全栈框架&#xff0c;由 Vercel 团队开发和维护。它提供了一系列开箱即用的功能&#xff0c;使开发者能够快速构建高性能的 Web 应用。 核心优势 服务端渲染 (SSR)静态站点生成 (SSG)增量静态再生成 (ISR)文件系统路由API 路由图…...

【springsecurity oauth2授权中心】简单案例跑通流程

项目被拆分开&#xff0c;需要一个授权中心使得每个项目都去授权中心登录获取用户权限。而单一项目里权限使用的是spring-security来控制的&#xff0c;每个controller方法上都有 PreAuthorize("hasAuthority(hello)") 注解来控制权限&#xff0c;想以最小的改动来实…...

golang channel源码

解析 数据结构 hchan&#xff1a;channel 数据结构 qcount&#xff1a;当前 channel 中存在多少个元素&#xff1b; dataqsize: 当前 channel 能存放的元素容量&#xff1b; buf&#xff1a;channel 中用于存放元素的环形缓冲区&#xff1b; elemsize&#xff1a;channel 元素…...

小刚说C语言刷题——1033 判断奇偶数

1.题目描述 输入一个整数&#xff0c;判断是否为偶数。是输出 y e s &#xff0c;否则输出n o。 输入 输入只有一行&#xff0c;包括 1个整数&#xff08;该整数在 1∼10000的范围内&#xff09;。 输出 输出只有一行。&#xff08;注意输出格式&#xff0c;具体请看下方提…...

2025TGCTF Web WP复现

AAA 偷渡阴平 <?php$tgctf2025$_GET[tgctf2025];if(!preg_match("/0|1|[3-9]|\~|\|\|\#|\\$|\%|\^|\&|\*|\&#xff08;|\&#xff09;|\-|\|\|\{|\[|\]|\}|\:|\|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $tgctf2025)){//hint&#xff1a;你可以对着键盘…...

基于DeepSeek的考研暑假日志分析

注&#xff1a;我去年考研时写了日志&#xff0c;大致记录了我每天的主要活动。由于过于琐碎&#xff0c;一直没有翻看。突发奇想&#xff0c;现在利用deepseek总结其中规律。 从你的日志中可以总结出以下规律和活动兴衰起落&#xff1a; ​​一、学习活动规律与演变​​ ​​…...

「GitHub热榜」AIGC系统源码:AI问答+绘画+PPT+音乐生成一站式

—零门槛搭建私有化AI内容工厂&#xff0c;源码开放商业落地指南 为什么全栈AIGC系统成为企业刚需&#xff1f; 1. 传统方案的致命缺陷 痛点 使用ChatGPTMidjourneyCanva 本全栈方案 工具割裂 需切换5平台 一个系统全搞定 成本 年费50万 一次部署永久免费 数据安全 …...

AWS上构建基于自然语言的数值和符号计算系统

我想要实现一个通过使用C#、Semantic Kernel库、OpenAI GPT 4的API和以下使用C#开源库MathNet实现通过中文自然语言提示词中包含LATEX代码输入到系统,通过以下符号和数值计算和其它符号和数值计算程序输出计算结果和必要步骤的应用,这样的数学计算使用程序直接产生结果,可以…...

【C++】 —— 笔试刷题day_19

一、小易的升级之路 题目解析 小易现在要打游戏&#xff0c;现在游戏角色的初始能力值为a&#xff0c;我们会遇到n个怪&#xff0c;这些怪物的防御值为b1、b2、b3...&#xff0c;如果我们的能力值要高于或者等于怪物的防御值&#xff0c;那我们的能力值就会加bi&#xff1b;如…...

解决 Spring Boot 多数据源环境下事务管理器冲突问题(非Neo4j请求标记了 @Transactional 尝试启动Neo4j的事务管理器)

0. 写在前面 到底遇到了什么问题&#xff1f; 简洁版&#xff1a; 在 Oracle 与 Neo4j 共存的多数据源项目中&#xff0c;一个仅涉及 Oracle 操作的请求&#xff0c;却因为 Neo4j 连接失败而报错。根本原因是 Spring 的默认事务管理器错误地指向了 Neo4j&#xff0c;导致不相…...

Oracle日志系统之重做日志和归档日志

Oracle日志系统之重做日志和归档日志 重做日志归档日志 本文讨论Oracle日志系统中对数据恢复非常重要的两个日志&#xff1a;重做日志和归档日志。 重做日志 重做日志&#xff0c;英文名Redo Log&#xff0c;顾名思义&#xff0c;是用来数据重做的&#xff0c;主要使用场景是事…...