测试替身Test Doubles的5类型(Mockito)
测试替身Test Doubles的5类型(Mockito)
我们有一个名为 BankAccount 的类。
数据库用于存储和检索银行帐户信息。

我们想测试 BankAccount 中的逻辑,而不必担心它使用的底层数据库.由此类实现——它将 SQL 查询发送到数据库并返回其中包含的值。
测试替身Test Doubles
测试替身是“替代”某些原始类的类,允许测试避免使用原始类代替时所需的一些复杂性。测试替身有点像特技替身——我们不使用真正的演员,而是使用另一个 看起来像,但让所有困难的事情看起来很容易!
测试替身的类型
1 Dummies
2 Stubs
3 Fakes
4 Mocks
5 Spies
Dummies
Dummies 是代替实物的物体
然而,测试从来没有使用伪,它的目的只是满足编译器的要求。
我们假设BankAccountDatabaseConnection是一个Java接口,我们可以用不同的方式实现它进行测试。但是实际类的方法可以很容易地被重写以获得相同的效果。


数据库本身对此测验并不重要,所以我们只需要一个假dummy来编译测试。

Stubs
Stubs是覆盖原始类的某些方法的对象,以便可以测试其他类/方法。



Fakes
Fakes提供了真实对象的伪实现。这里是数据库功能的“内存中”实现。
请注意fakes的缺点——本质上,我们正在实现更多需要测试的功能。

Mocks
Mock扩展了Stub的概念——它们允许您控制方法返回的值,但也可以确认方法是用正确的值作为参数调用的。

除非我们使用假的(并为假的写更多的测试),否则无法确定进入数据库以设置银行账户余额的值是否正确。
Mock:

明确验证是否指示数据库将账号为1000的余额金额设置为200英镑。
Test using mock:

Spies
Spies类似于mock,但没有Stub方法(返回预定值的方法)。也就是说,它们只做方法调用的日志记录和检查部分。它们对于检查单元和外部组件之间的接口很有用。(有时它们甚至被用作集成测试的一部分。)
例如,它们可以用于监视方法并检查是否生成了正确的SQL。或者,在调用服务发送电子邮件之前,电子邮件的内容是预期的。
小心Doubles
请注意,有多少示例涉及到关于类被加倍的许多实现细节。特别是:
•Fakes需要自己的测试(!),因为他们涉及更多实施
•Mocks记录有关单个方法调用的详细信息,使它们容易变得脆弱。
因此,请小心使用Doubles,并且仅在必要时使用。
保持事情尽可能真实往往是最好的方法,同时避免双重性。
Mockito
每次你想测试一些东西时,写一个新的测试Doubles可能会很痛苦,很快。
Mockito是生成用于JUnit的mock的有用框架。
由于Mocks是Stubs和Spices,而Stubs更专业的Dummies版本,Mockito可以生成除Fake之外的所有类型的Doubles。
Mock example with Mockito
Test using manually written mock:

Manually- written mock class:

Test using virtual mock:
在 Java 中,虚拟模拟测试是指在单元测试期间使用模拟框架来模拟依赖项或外部组件的行为的做法。 模拟是一种用于隔离被测试代码的技术,它通过用可以控制和验证的虚假实现替换真实的依赖关系。
以下是如何在 Java 中进行虚拟模拟测试的一般概述:
-
选择模拟框架:Java 有几种流行的模拟框架,例如 Mockito、PowerMock 和 EasyMock。 选择一个适合您需要的,并将其作为依赖项包含在您的项目中。
-
Identify the Dependencies:确定需要模拟的外部依赖。 这些依赖项通常是您的代码所依赖的其他类、接口或外部服务。
-
创建模拟对象:使用模拟框架,创建模拟依赖项行为的模拟对象。 这些模拟对象将在测试期间替换真实的实现。
-
定义模拟行为:指定模拟对象的期望行为。 您可以将它们配置为返回特定值、模拟异常或在调用某些方法时执行其他操作。
-
将模拟注入到测试中:在您的测试代码中,将模拟对象注入到被测试的类或方法中。 这通常是通过构造函数注入、setter 注入或使用像 Spring 这样的依赖注入框架来完成的。
-
编写测试用例:编写测试用例以执行被测代码的功能。 当代码调用模拟依赖项上的方法时,它们将根据模拟对象中定义的行为做出响应。
-
验证交互:执行被测试的代码后,您可以使用模拟框架的验证功能来断言特定方法在模拟对象上被调用并使用预期参数。
-
运行测试:使用您喜欢的测试框架(例如 JUnit 或 TestNG)执行测试用例。 测试框架将运行测试并报告任何失败或错误。
通过使用虚拟模拟测试,您可以在不依赖实际依赖项的情况下有效地隔离和测试各个代码单元,从而使测试过程更加集中和高效。 Mocking 允许您模拟不同的场景、边缘情况和错误条件,以确保您的代码在各种情况下都能正确运行。

使用mock()生成mock对象。我们从来没有(也不需要)看到任何实际的代码——因为它无论如何都不存在
为mock生成“Stubbed”方法
Fake Turned Into a Mock
Test using manually written fake:

Manually written fake class:

它只是为了测试,但我们也需要测试它!

我们可以改用Mock。
此代码类似于Mock的最后一个示例。
Dummy Example with Mockito
Test using manually written dummy:

Manually written dummy class:

Test using virtual mock (which is a dummy in this case):

生成模拟对象。 由于我们不去stub或验证任何方法,因此它实际上是一个dummy
Stub Example with Mockito
Test using manually written stub:

Manually written stub class:

生成模拟对象并“stub”一个方法。
由于我们不去验证任何方法,它实际上是一个Stub

Mockito——总结
Mockito 可以省掉很多手动写 double 的工作。
Mockito 可以做的比我们在这里介绍的更多,请参阅
https://site.mockito.org/
Double会导致脆弱的测试。
始终考虑集成测试是否更合适。
相关文章:
测试替身Test Doubles的5类型(Mockito)
测试替身Test Doubles的5类型(Mockito) 我们有一个名为 BankAccount 的类。 数据库用于存储和检索银行帐户信息。 我们想测试 BankAccount 中的逻辑,而不必担心它使用的底层数据库.由此类实现——它将 SQL 查询发送到数据库并返回其中包含的值。 测试替身Test Dou…...
【C++】链表
链表是一种常见的数据结构,用于存储和组织数据。它的每个元素被称为结点(Node),结点是链表的基本单位,链表由一系列结点(Node)组成,每个结点包含两个部分:数据部分&#…...
day42_jsp
今日内容 零、 复习昨日 一、JSP 二、EL 三、JSTL 四、MVC 零、 复习昨日 一、JSP 1.0 引言 现有问题 在之前学习Servlet时,服务端通过Servlet响应客户端页面,有什么不足之处? 开发方式麻烦:继承父类、覆盖方法、配置Web.xml或注…...
JAVA面试八股整理——基础部分
JAVA 基础 JVM JDK JRE JVM java虚拟机,针对不同的系统,使用相同的字节码会给出相同结果。一次编译,随处可运行 JDK Java SDK 提供给开发者使用,创建和编译Java程序。包含了JRE,同时包含了其它工具(jav…...
【JavaSE】Java基础语法(二十八):HashSet集合
文章目录 1. HashSet集合概述和特点2. HashSet集合的基本应用3. 哈希值4. HashSet集合存储学生对象并遍历【应用】 1. HashSet集合概述和特点 底层数据结构是哈希表存取无序不可以存储重复元素没有索引,不能使用普通for循环遍历 2. HashSet集合的基本应用 存储字符串并遍历 …...
压缩感知重构之匹配追踪算法
算法的重构是压缩感知中重要的一步,是压缩感知的关键之处。因为重构算法关系着信号能否精确重建,国内外的研究学者致力于压缩感知的信号重建,并且取得了很大的进展,提出了很多的重构算法,每种算法都各有自己的优缺点&a…...
【SpinalHDL快速入门】4.6、复合类型之Vec
文章目录 1.1、描述1.2、声明1.2.1、实例 1.3、运算符1.3.1、比较(Comparison)1.3.2、类型转换(Type cast)1.3.3、杂项(Misc)1.3.4、Lib辅助函数(Lib helper functions) 1.1、描述 …...
探访世优科技数字人虚拟直播产品体系 | 世优开放日再次成功举行
2023年5月30日,世优科技全栈技术产品体验活动(第二期)顺利落下帷幕。此次活动共邀请到30余位各行各业的嘉宾到场,在两个多小时的开放日活动中,世优科技全面展示数字人及虚拟直播领域的技术产品体系。来访嘉宾们全程体验…...
有奖励!2023陕西省首台(套)重大技术装备产品项目申报条件、认定材料
本文整理了2023陕西省首台(套)重大技术装备产品项目申报条件,认定材料等相关内容,感兴趣的朋友快跟小编一起来看看吧! 一、重点支持方向及领域 重点支持方向及领域:高档工业母机、电力装备、大型矿山和冶金…...
2023/6/6总结
CSS 如果想要实现背景颜色渐变效果: left是从左边开始,如果想要对角线比如,左上角就是left top,渐变效果始终是沿着一条线来实现的。 下面是跟着视频教学用flex布局写的一个移动端网页: html代码: <!…...
api习题
// 1 整数或者小数 // String a"378.000"; // String rex"[1-9]\\d*|[0-9]|*\\.[0-9]*"; // System.out.println(a.matches(rex)); // 2 只能输入数字: // String rex"\\b*"; // 3 只能输入n位的数字: // String r…...
(STL之string)string类的用法详解
string类成员函数PART1 成员函数(构造函数拷贝构造函数):string 函数原型: string(); string (const string& str); string (const string& str, size_t pos, size_t len npos); string (const char* s); string (const char* s, size_t n)…...
基于RT-Thread快速上手SD NAND 虚拟文件系统
SD NAND 也称之为贴片式TF卡,贴片式SD卡,采用标准的SDIO接口,兼容SPI接口。下图所示为CS 新一代CS SD NAND NP1GCR01-AOW 大小为128M,对比128M的SD卡,可以看到贴片SD卡尺寸更小,不要SD卡座,占…...
性能测试实战
目录 一、创建线程组与http(s)请求1、JMeter关键词2、创建线程组3、线程组参数举例说明案例1:模拟5个用户,同时访问百度案例2:模拟5个用户,同时访问百度,并且循环2次案例3:模拟5个线程,持续执行10秒的时间案例4:模拟10秒启动10个线程,循环执行20秒4、创建http请求a、操…...
【PWN · 总结】system返回shell(‘/bin/sh‘、‘sh‘、$(0))
pwn题中要通过system/excute等返回shell,进而cat flag。今天遇到一题,参数$(0)也可返回,有必要记录一下。 目录 前言 一、/bin/sh 1.strings 2.IDA 3.pwntools 4.ROPgadget 5.libc中寻找 二、sh 三、$(0) exp IDA查看机器码 …...
《庄子》笔记
庄子 前述:庄子,战国时宋国人。 1.鲲鹏:胸襟宽广,高远,无界限。 2.寒蝉和灵龟:小年的悲哀。 3.小麻雀的得意:境界不同,又有什么可比性呢。 4.列子随风而行:得大道者&…...
五、VBO、EBO 和 VAO
五、VBO、EBO 和 VAO VBO、EBO 和 VAO: VBO(Vertex Buffer Object)是指顶点缓冲区对象,而 EBO(Element Buffer Object)是指图元索引缓冲区对象,VAO 是顶点数据的缓冲区对象,VAO 和…...
数据库期末复习(7.2)查询优化
查询优化的概述 商用数据库花了很多的资金投入到查询优化。 查询优化的分类 逻辑查询优化 物理查询优化 比逻辑查询计划多了怎么去执行的方式,为的是数据操作速度更快 逻辑查询优化的三种关键技术 在科学研究的道路上我们往往不是一帆风顺的,人的认识也是局限的,但是我…...
深入探索:在std::thread中创建并管理QEventLoop的全面指南
深入探索:在std::thread中创建并管理QEventLoop的全面指南 1. 前言:理解QEventLoop和std::thread的基本概念1.1 QEventLoop的基本概念和工作原理1.2 std::thread的基本概念和工作原理1.3 QTimer的基本概念和工作原理 2. 在std::thread中创建QEventLoop&a…...
【Netty】Netty中的超时处理与心跳机制(十九)
文章目录 前言一、超时监测二、IdleStateHandler类三、ReadTimeoutHandler类四、WriteTimeoutHandler类五、实现心跳机制5.1. 定义心跳处理器5.2. 定义 ChannelInitializer5.3. 编写服务器5.4. 测试 结语 前言 回顾Netty系列文章: Netty 概述(一&#…...
实测Guohua Diffusion国风生成效果:荷塘锦鲤、竹林薄雾,画面太美了
实测Guohua Diffusion国风生成效果:荷塘锦鲤、竹林薄雾,画面太美了 1. 国风绘画工具初体验 当我第一次打开Guohua Diffusion时,就被它简洁的界面设计所吸引。整个工具没有任何冗余参数,只有几个核心选项:画幅选择、提…...
智能协作:让快马AI成为你的算法优化顾问,自动分析并改进代码
今天想和大家分享一个特别实用的开发技巧——如何用AI辅助优化算法代码。作为一个经常和动态规划算法打交道的开发者,我发现InsCode(快马)平台的AI功能真的能帮我们省去很多重复劳动。 先说说我最近遇到的一个实际问题:经典的0-1背包问题。虽然动态规划…...
解锁3大技术场景:PptxGenJS自动化演示文稿实战指南
解锁3大技术场景:PptxGenJS自动化演示文稿实战指南 【免费下载链接】PptxGenJS Create PowerPoint presentations with a powerful, concise JavaScript API. 项目地址: https://gitcode.com/gh_mirrors/pp/PptxGenJS 在数字化办公与开发领域,演示…...
解决Windows任务栏视觉单调问题的3个实用工具:RoundedTB个性化方案
解决Windows任务栏视觉单调问题的3个实用工具:RoundedTB个性化方案 【免费下载链接】RoundedTB Add margins, rounded corners and segments to your taskbars! 项目地址: https://gitcode.com/gh_mirrors/ro/RoundedTB 每天面对电脑时,那块占据屏…...
STM32开发必备:用CmBacktrace一键定位HardFault死机问题(附Keil配置指南)
STM32开发实战:用CmBacktrace精准捕获HardFault的终极指南 当你的STM32程序突然陷入HardFault死循环时,是否经历过这样的绝望时刻?仿真器连上又断开,寄存器值看了又看,函数调用栈却始终是个谜。今天,我将带…...
停止健身房“赎罪”:把动作揉进日常,比发狠管用
健身房的惩罚 vs 生活中的律动 专栏:清醒日常 | 重新认识这副皮囊 (02) 老哥,今天咱们聊聊一个挺普遍,但很少有人愿意戳破的现象。 你有没有过这种经历:白天在公司极其憋屈地坐了十个小时,改了八遍PPT,晚…...
3分钟终极解决方案:快速解除Cursor试用限制的完整指南
3分钟终极解决方案:快速解除Cursor试用限制的完整指南 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. We …...
MySQL 8.0在麒麟系统安装后,别忘了这几步:改密码、开远程、设自启
MySQL 8.0在麒麟系统安装后的关键配置指南 当你成功在麒麟V10 SP3系统上安装了MySQL 8.0数据库后,真正的挑战才刚刚开始。许多初学者往往忽视了安装后的关键配置步骤,导致数据库安全性不足或功能受限。本文将带你深入了解如何正确完成这些关键配置&…...
Z-Image-Turbo-辉夜巫女材质与光影专题:金属、玻璃、织物等不同质感的极致渲染
Z-Image-Turbo-辉夜巫女材质与光影专题:金属、玻璃、织物等不同质感的极致渲染 你有没有想过,为什么有些AI生成的图片看起来“假假的”,一眼就能认出来?很多时候,问题就出在“质感”上。金属不像金属,玻璃…...
小说作者必备:次元画室快速构建角色设定,灵感秒变草图
小说作者必备:次元画室快速构建角色设定,灵感秒变草图 你是否经常遇到这样的困境:脑海中浮现出一个鲜活的角色形象,却苦于无法用文字准确描述?或者写好了人物设定,却找不到合适的画师将其可视化࿱…...
