单元测试框架 Mockito 注解 – @Mock, @Spy, @Captor, @InjectMocks

Spring 单元测试核心注解全解:@InjectMocks、@MockBean、@Mock、@Autowired 的区别与实战 对比维度@Mock@MockBean@Autowired所属体系MockitoMockito是否进容器否否是(替换容器中的 Bean)是(注入容器中的 Bean)是否自动注入依赖否是是是推荐场景纯 Java 单测搭配 @Mock 使用替换容器依赖(整合测试)注入容器内真实对象@Mock:用于快速构造模拟对象,脱离容器;:自动注入多个 mock 到目标类;@MockBean:Spring Boot 提供的 Mock 注入工具,替换容器中原始 Bean; 阅读详情
AI摘要

本文详细介绍了Mockito框架中的四个关键注解:@Mock用于创建模拟对象,@Spy结合真实对象进行监视,@Captor捕获方法参数进行验证,@InjectMocks用于依赖注入。理解这些注解有助于提升单元测试的效率和代码可读性。

转载翻译自 https://howtodoinjava.com/mockito/mockito-annotations/

这篇 mockito 的教程文章能够帮助你了解更多 mockito 注解,比如 @Mock, @Spy, @Captor, @InjectMocks,来写出更好的单元测试。

1. Mockito 注解

1.1. @Mock

@Mock 注解被往往用来创建以及注入模拟实例。我们会用 mockito 框架创建一个模拟的实例类,而不是去真的创建需要的对象。

@Mock 注解也可以用 var somethingYouWantMock = Mockito.mock(classToMock) 这种函数方式赋值来替代,它们的效果是一样的,而用 @Mock 注解通常能能看起来代码 “整洁” 一点,因为我们不会想用一堆看起来一样的 Mockito.mock 函数在代码里重复得到处都是。

@Mock 注解的优势:

  • 能够快速创建测试所需的对象
  • 重复的模拟创建代码很少
  • 测试类可读性更好
  • 更容易看懂验证报错,因为注解的模拟类直接是类的属性,可以用字段名去赋予含义。

在下面给出的示例中,我们模拟了HashMap类。在实际测试中,我们将模拟实际的应用类。我们在map中放入一个键值对,然后验证,确认方法调用是在模拟的map实例上执行的。

@Mock
HashMap<String, Integer> mockHashMap;
 
@Test
public void saveTest()
{
    mockHashMap.put("A", 1);
     
    Mockito.verify(mockHashMap, times(1)).put("A", 1);
    Mockito.verify(mockHashMap, times(0)).get("A");
 
    assertEquals(0, mockHashMap.size());
}

译者补充:mock意思就是造一个假的模拟对象,不会去调用这个真正对象的方法,这个mock对象里的所有行为都是未定义的,属性也不会有值,需要你自己去定义它的行为。比如说,你可以mock一个假的size(), 使其返回100,但实际上并没有真的创建一个 size 为100的 Map)

...
    when(mockHashMap.size())
        .thenReturn(100);
    
    assertEquals(100, mockHashMap.size());
...

1.2. @Spy

@Spy注释用于创建一个真实对象并监视这个真实对象。@Spy对象能够调用所监视对象的所有正常方法,同时仍然跟踪每一次交互,就像我们使用mock一样,可以自己定义行为。

可以看到,在下面给的示例中,由于我们向它添加了一个 key-value 键值对,size 变成了 1。我们也能够得到真正的通过键 key 去拿到 value 值的结果。这在 Mock 注解的例子中是不可能的。

译者补充: 因为mock是模拟整个生成一个假对象,spy像是间谍潜伏在真实对象里去篡改行为。

@Spy
HashMap<String, Integer> hashMap;
 
@Test
public void saveTest()
{
    hashMap.put("A", 10);
     
    Mockito.verify(hashMap, times(1)).put("A", 10);
    Mockito.verify(hashMap, times(0)).get("A");
     
    assertEquals(1, hashMap.size());
    assertEquals(new Integer(10), (Integer) hashMap.get("A"));
}

@Mock和@Spy的区别

在使用@Mock时,mockito创建了类的一个基础套壳实例,完全用于跟踪与它的全部交互行为。这不是一个真正的对象,并且不维护状态,不存在更改。

当使用@Spy时,mockito创建一个类的真实实例,可以跟踪与它的每个交互行为,这个真实类能维护类状态的变化。

1.3 @Captor

@Captor注释用于创建ArgumentCaptor实例,该实例用于捕获方法参数值,来用于进一步做断言验证。

注意mockito使用参数类的equals()方法验证参数值是否相同。

@Mock
HashMap<String, Integer> hashMap;
 
@Captor
ArgumentCaptor<String> keyCaptor;
 
@Captor
ArgumentCaptor<Integer> valueCaptor;
 
@Test
public void saveTest() 
{
    hashMap.put("A", 10);
 
    Mockito.verify(hashMap).put(keyCaptor.capture(), valueCaptor.capture());
 
    assertEquals("A", keyCaptor.getValue());
    assertEquals(new Integer(10), valueCaptor.getValue());
}

1.4 @InjectMocks

在mockito中,我们需要创建被测试的类对象,然后插入它的依赖项(mock)来完全测试行为。因此,我们要用到 @InjectMocks 注释。

@InjectMocks 标记了一个应该执行注入的字段。Mockito会按照下面优先级通过构造函数注入、setter注入或属性注入,来尝试注入你标识的mock。如果上面三种任何给定的注入策略注入失败了,Mockito不会报错。

更多信息: Mock和@ initmock注释的区别

译者补充: @InjectMocks 一般是你要测的类,他会把要测类的mock属性自动注入进去。@Mock 则是你要造假模拟的类。

Mockito使用详解 Mockito 是一个针对 Java 的单元测试模拟框架,可以简化单元测试过程中测试上下文对象。它可以做如下事情: 1)模拟方法的返回值、模拟抛出异常 2)验证方法被调用次数、验证方法参数类型 3)捕获方法参数值 4)为真实对象创建一个监控(spy)对象 注意: 1)不能 Mock 静态方法 2)不能 Mock private 方法 3)不能 Mock final class 阅读详情

相关推荐

SpringBoot整合Mockito进行单元测试超全详细教程 | JUnit断言 | Mockito | 单元测试

本文介绍了使用 Mockito 进行单元测试的基本流程,讲解了通过 @Mock、@Spy、@InjectMocks 等注解创建模拟对象,使用 when(...) 和 doReturn(...) 等方法定义模拟行为,并展示了如何结合 Spring 上下文通过 @MockBean 和 @SpyBean 进行部分或完全模拟。文章最后通过示例演示了测试的完整流程,包括设置环境、执行测试、验证方法调用和断言结果。

m0_73365120的博客 7196

mock详解

使用 Mockito 的 @InjectMocks 创建被测试类实例 2018-02-01 — Yanbin   初识 Mockito 这个测试框架后,我们要使用 Mock 的属性创建一个被测试类实例时,大概会下面这么纯手工来打造。 假定类 UserService 有一个属性 UserDao userDao, 需要构造 UserService 实例时 Mock 内部状态 UserDao...

u011280083的博客 1万+

5G(NR)物理层面试问答

1.什么是参数集(Numerologies)? 答:在5G中由于其频段很宽,设置了不同的子载波带宽,另根据频段、循环前缀、帧结构等组成了参数集。 2.5G中的循环前缀有几种? 答:5G网络支持5种子载波间隔,有两种循环前缀(正常和扩展)。其中:参数集2,即子载波间隔60kHz支持常规循环前缀和扩展循环前缀。 3.5G无线网络在下行(DL)和上行(UL)均使用OFDM波形? 答:5G网络下行链路(DL)和上行链路(UL)使用的波形及处理见下图: 4.5G物理层帧和子帧是多长时间? 答:5G.

starts1990的博客 2378

@Mock,@Spy和@InjectMock

1、@Mock:mock对象,对函数的调用均使用mock,不会调用真实方法,使用: Mockito.when(testService.getById(Mockito.any())).thenReturn(testPo); 2、@Spy:spy对象,对函数的调用是真实掉用,如果不想真实调用可以使用: Mockito.doReturn(true).when(testService).save(Mockito.any()); 3、@InjectMocks:创建一个实例,简单的说是这个Mock可以调用

Pichairen 7877

VirtualBox 7.0.8 + Android-x86 9.0 保姆级安装教程(附图形界面卡顿解决方案)

本文提供VirtualBox 7.0.8与Android-x86 9.0的详细安装教程及性能优化方案,帮助开发者解决图形界面卡顿问题。从环境准备到高级配置,涵盖硬件要求、安装步骤、显存优化及ADB调试等实用技巧,显著提升虚拟机流畅度,适用于应用测试和开发调试。

weixin_29224309的博客 527

PCI Express 权威指南:从协议原理到芯片实现

目录 全文总览第一部分:PCIe体系结构概览第1章 互连技术的演进与PCIe的诞生1.1 从ISA到PCI:并行总线的辉煌与瓶颈1.2 PCI-X的尝试与局限1.3 串行革命:从AGP、PCI到PCIe的范式转移1.4 PCIe的核心优势第2章 PCIe系统全局视角2.1 系统拓扑:Root Complex, Switch, Endpoint的职能与关系2.2 拓扑结构实例:服务器、工作站、嵌入式系统2.3 枚举与配置:系统如何发现和组织PCIe设备2.4 地址空间第3章 PCIe协议分层架构3.1 分层模

qq_42882296的博客 2894

mock详细教程入门这一篇就够了(*)

mock测试

weixin_42408447的博客 5643

(3dnr)多帧视频图像去噪 (一)

视频图像去噪主要利用相邻帧间内容相似性,通过时域帧平均降低随机噪声。为避免运动物体产生"拖尾"现象,可采用运动自适应或运动补偿时域滤波方法。前者根据运动强度动态调整滤波系数,后者通过运动补偿使参考帧更接近当前帧。运动补偿方法虽能更好处理运动区域,但计算复杂度高且对快速运动场景效果有限。相比之下,运动自适应方法在实时视频处理中更具优势,能平衡去噪效果与硬件资源消耗。两种方法可根据场景动态切换以获得最佳去噪效果。

大熊 1871

@Mock, @Spy, @Captor and @InjectMocks

http://www.baeldung.com/mockito-annotations 1. Overview In this tutorial, we’ll cover all the annotations in the Mockito library– @Mock, @Spy, @Captorand @InjectMocks. 2. Enable Mockito Annota

u013428664的专栏 3974

LVS 负载均衡面试题及参考答案

什么是 LVS 负载均衡?它的主要作用是什么? LVS(Linux Virtual Server)是一个基于 Linux 内核的开源负载均衡项目。它通过将请求流量按照一定的算法分发到后端的多个真实服务器(Real Server)上,从而实现负载均衡的功能。 从原理上来说,LVS 工作在网络层和传输层之间。当客户端发起请求时,请求首先到达 LVS 服务器,LVS 会根据预先设定的规则和算法,比如轮询(Round - Robin)、加权轮询(Weighted Round - Robin)、最少连

大模型大数据攻城狮的专栏 1469

NSIS教程(6): 使用第三方插件

NSIS内置了很多指令,这些指令可以满足我们基本需求,但难免会遇到NSIS没有内置的功能,如进程操作,后台运行(即多线程),7z压缩等等,这个时候我们就需要借助第三方插件来满足我们所需要的功能了。 一、插件获取 NSIS官方收录插件的网址是:http://nsis.sourceforge.net/Category:Plugins,我们可以在这个网站上查找和下载我们需要的插件,该网站上针对每

while(1) { smile(); } 9万+

@Mock @Spy @InjectMocks @Captor 注解

当我们需要对UserServiceImpl 进行单元测试时,就需要通过@InjectMocks 生成我们的被测试类UserServiceImpl ,用@Mock 来生成我们的模拟依赖对象UserManagerImpl,此时Mockito会将UserManagerImpl自动注入到UserServiceImpl 中,我们在调用userService.createUser()方法时就不会报空指针异常了。@InjectMocks注解用来创建被测试的类对象,他的依赖对项由@Mock来创建;

mingyonghu的博客 4417

道通无人机信号分析

本文分析了道通无人机及其遥控器的EIRP参数(表1-2),发现不同地区的功率标准存在差异。针对5230MHz图传信号,观测到四帧连续信号结构类似LORA分包传输。脉冲分析(表3)显示固定3.9ms脉宽和1.1ms间隔。频谱异常表现为非矩形窗特征,经分析系多径效应引起的频率选择性衰落所致——不同路径传播导致特定频率出现相长/相消干涉,形成波峰波谷的起伏频谱特征。这种现象与无线信道的多径时延、衰减差异直接相关。

jiaotinglang2580的博客 487

SpringBoot JUnit 5 中关于@Spy、@Mock和@InjectMocks注解的使用总结

@Spy和@Mock的区别: @Spy修饰的属性里面的方法可以按照真实情况执行,在需要的时候可以打桩模拟执行结果,使用方式是Mockito.doReturn().when()--全都执行,有需要在改。 @Mock修饰的属性都是null,在执行单元测试的时候每个方法都需要打桩模拟执行结果,使用方式是Mockito.when().thenReturn()--全部不执行,避免意外。 <p> <p> <p> @Spy和@InjectMocks...

站在搜素引擎上的巨人 1万+

什么是垂直同步?电脑快速消除屏幕撕裂与提升游戏性能的方法 垂直同步、游戏画面撕裂、游戏优化、VSync、FPS、FreeSync、G-Sync、显卡驱动更新、游戏画质、输入延迟

看这张动图,左边的画面出现了明显“切开”的断层现象,而右边画面非常流畅,没有撕裂。这正是「垂直同步」开关的区别。:每秒生成多少帧图像。比如 60FPS 表示一秒钟显示 60 张图片。刷新率(Refresh Rate):显示器每秒刷新几次画面,单位是赫兹(Hz)。60Hz 表示每秒刷新 60 次。参数说明FPS显卡渲染速度(逻辑帧率)刷新率显示器的显示频率(物理限制)当 FPS 高于刷新率时,显卡渲染的画面来不及被显示器显示,导致撕裂。屏幕撕裂(Screen Tearing)

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1347

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

@InjectMocks

初识 Mockito 这个测试框架后,我们要使用 Mock 的属性创建一个被测试类实例时,大概会下面这么纯手工来打造。 假定类 MyService 有一个属性 MyRepository myRepository: @Repository public class MyRepository { public void doSomething() { System.out.println("here's dosomething"); } public M

he1365646879的博客 7919

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

@Mock 和 @InjectMocks的区别

@Mock和@InjectMocks的区别

wsd_ontheroad的博客 3479

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring Boot 中 Mockito.mock()、@Mock 和 @MockBean 注解的区别

什么是@Mock 注解? @Mock 是 Mockito 库提供的注解,Mockito 库是一种流行的模拟框架,用于在 Spring Boot 应用程序中进行单元测试。它用于为不属于 Spring 上下文的依赖项创建模拟对象。 @Mock注释通常与MockitoJUnitRunner或MockitoExtension 结合使用来初始化模拟对象。即使没有 Spring Framework,您也很有可能在编写单元测试时模拟对核心 Java 应用程序的依赖时使用了此注释。 when ()方法用于定义 mock 对

weixin_43302950的博客 4573

@Mock@Spy@MockBean@SpyBean对比

mockito 注解 package org.mockito; mockito 定义的注解 主要有三个: @Mock @Spy @InjectMocks // demo @InjectMocks private MyService myService; @Mock MyMockMapper myMockMapper; @Spy MySpyMapper mySpyMapper; 说明 @Spy和@Mock生成的对象不受spring管理,也不会替换Spring对应类型的bean @InjectMo

耘田 3574

Mockito 框架的 @Mock 和 @InjectMocks 注解使用指南

本文详细介绍了 Mockito 测试框架中的 @Mock 和 @InjectMocks 注解,阐释了它们在自动化创建和注入模拟对象方面的重要性和使用方法。通过实例演示了如何简化单元测试中的依赖注入过程,强调了它们在处理私有构造函数、setter 方法以及基本类型参数时的特殊行为,并指出了在使用这些注解时可能遇到的问题和注意事项。

数据与算法架构提升之路专栏 1万+

@Mock、@Spy、@MockBean 和 @SpyBean 注解的区别

@Mock、@Spy、@MockBean 和 @SpyBean 是在 单元测试中用于模拟对象行为的注解。它们都属于 Mockito或 Spring测试框架的功能,主要用于隔离测试中的依赖,创建 mock 对象或部分 mock 对象(spy),从而可以对被测代码进行更精确的测试。

weixin_43587190的博客 2370

Mock 测试技术详解及高级特性,你不得不会的技能!

Mock 测试是一种软件测试技术,它可以模拟外部依赖组件的行为和状态,以便进行独立、稳定和快速的测试。在实际软件开发中,我们常常需要依赖其他组件或服务来完成某些业务逻辑,例如数据库、网络连接、消息队列等等。这些外部依赖可能存在各种问题,例如不稳定、缺乏数据、难以模拟等等,从而影响我们对代码逻辑的测试、调试和优化。Mock 测试可以解决这些问题,它通过构造和配置 Mock 对象来模拟外部依赖的行为和状态,从而使得测试变得独立、稳定和准确。

兴趣是最好的老师,勤能补拙 7013

Mockito的使用(二)——@InjectMocks、@Spy、@Mock

项目中,有些函数需要处理某个服务的返回结果,而在对函数单元测试的时候,又不能启动那些服务,这里就可以利用Mockito工具,其中有如下三种注解: @InjectMocks:创建一个实例,简单的说是这个Mock可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。 @Mock:对函数的调用均执行mock(即虚假函数),不执行真正部分。 @Spy:对函数的调用均...

u011047968的专栏 6万+

单元测试之@Mock与@InjectMocks(一文搞懂)

InjectMocks:要测试的类,使用@Mock修饰的对象,就是我们测试哪个类,就用它修饰对应的变量,会整合使用@Mock修饰的对象。@Mock:需要模拟的类,我们需要模拟哪些类,就用它修饰哪些类的变量,常用于第三方服务service。

大魔王技术之家 3942

@Spy、@SpyBean、@MockBean、@Mock、@RunWith、@ExtendWith对比

在写单元测试中经常会用到Mockito,但是这些类似的注解非常混乱,今天总结一下相关的注解,说明其中的含义和实现例子。@Spy、@SpyBean、@MockBean、@Mock、@RunWith、@ExtendWith,带bean的就跟集成测试有关,例如集成Spring,如果只是简单的单元测试可以配置不带Bean的,这里面最好区分的还是@RunWith和@ExtendWith,一个是JUnit4一个是JUnit5。

查拉图斯特拉talk的博客 2317

Mockito框架常用注解

Mockito框架常用注解包括: 1. @Mock:用于创建被mock的对象实例。 2. @Spy:用于创建被spy的对象实例,即保留原对象的行为。 3. @InjectMocks:用于创建需要注入被mock对象的类的实例。 4. @Captor:用于捕获方法调用的参数,方便进行进一步的断言和校验。 5. @MockBean:用于创建Spring Bean的Mock对象,主要用于集成测试。 6. @MockitoSettings:用于设置Mockito框架的全局设置。

洪晓鸿 4212
上一篇: Spring 响应式编程 随记 -- C2 Spring 响应式编程基本概念 (四)
维生素P
博客等级 码龄9年 14粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值