测试替身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是覆盖原始类的某些方法的对象,以便可以测试其他类/方法。

在这里插入图片描述
Stubs are objects that override certain methods of the original so that some other class/method can be tested.
在这里插入图片描述
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 中进行虚拟模拟测试的一般概述:

  1. 选择模拟框架:Java 有几种流行的模拟框架,例如 Mockito、PowerMock 和 EasyMock。 选择一个适合您需要的,并将其作为依赖项包含在您的项目中。

  2. Identify the Dependencies:确定需要模拟的外部依赖。 这些依赖项通常是您的代码所依赖的其他类、接口或外部服务。

  3. 创建模拟对象:使用模拟框架,创建模拟依赖项行为的模拟对象。 这些模拟对象将在测试期间替换真实的实现。

  4. 定义模拟行为:指定模拟对象的期望行为。 您可以将它们配置为返回特定值、模拟异常或在调用某些方法时执行其他操作。

  5. 将模拟注入到测试中:在您的测试代码中,将模拟对象注入到被测试的类或方法中。 这通常是通过构造函数注入、setter 注入或使用像 Spring 这样的依赖注入框架来完成的。

  6. 编写测试用例:编写测试用例以执行被测代码的功能。 当代码调用模拟依赖项上的方法时,它们将根据模拟对象中定义的行为做出响应。

  7. 验证交互:执行被测试的代码后,您可以使用模拟框架的验证功能来断言特定方法在模拟对象上被调用并使用预期参数。

  8. 运行测试:使用您喜欢的测试框架(例如 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会导致脆弱的测试。
始终考虑集成测试是否更合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26345.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django实现接口自动化平台(五)httprunner(4.x)介绍【持续更新中】

上一章: Django实现接口自动化平台(四)解决跨域问题【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章: 一、httpruner介绍 1.1 背景: 之所以学习httpruner的用法,是要把httpruner嵌入我们的自动化平…

自动缩放Kubernetes上的Kinesis Data Streams应用程序

想要学习如何在Kubernetes上自动缩放您的Kinesis Data Streams消费者应用程序,以便节省成本并提高资源效率吗?本文提供了一个逐步指南,教您如何实现这一目标。 通过利用Kubernetes对Kinesis消费者应用程序进行自动缩放,您可以从其…

2023年陕西彬州第八届半程马拉松赛153pb完赛

1、赛事背景 2023年6月3日,我参加了2023陕西彬州第八届半程马拉松赛,最终153完赛,PB了5分钟。起跑时间早上7点30分,毕竟6月天气也开始热了。天气预报显示当天还是小到中雨,上次铜川宜君半马也是雨天跑的,阴…

lecory 波形二进制文件头(.trc)定义

1.文件头,从0字节开始 byte[] lecroy_trc_header new byte[]{0x23,0x39,0x30,0x30,0x32,0x30,0x30,0x30,0x31,0x34,0x34,0x57,0x41,0x56,0x45,0x44,0x45,0x53,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x45,0x43,0x52,0x4F,0x59,0x5F,0x32,0x5F,0x33,0x…

研发工程师玩转Kubernetes——使用Ingress进行路由

依据微服务理念,我们希望每个独立的功能由一个服务支持。比如有两个接口:http://www.xxx.com/plus和http://www.xxx.com/minus,前者由一个叫plus-service的服务支持,后者由一个叫minus-service的服务支持。这样就需要一个路由层&a…

Revit问题:创建牛腿柱和快速生成圈梁

一、Revit中如何用体量创建牛腿柱 牛腿:悬臂体系的挂梁与悬臂间必然出现搁置构造,通常就将悬臂端和挂梁端的局部构造,又称梁托。牛腿的作用是衔接悬臂梁与挂梁, 并传递来自挂梁的荷载。牛腿柱可以用于桥梁、厂房的搭建&#xff0c…

西南财经大学李玉周:数智化技术广泛使用推动管理会计加快落地

近日,由用友主办的「智能会计 价值财务」2023企业数智化财务创新峰会收官站圆满举办。来自知名院校的专家学者、央国企等大型企业财务领路人相约成都,一同见证“智能会计”新时代的到来,并肩探讨“价值财务”新主张。 为更好传递智能会计对企…

【接口测试】JMeter接口关联测试

‍‍1 前言 我们来学习接口管理测试,这就要使用到JMeter提供的JSON提取器和正则表达式提取器了,下面我们来看看是如何使用的吧。 2 JSON提取器 1、添加JSON提取器 在线程组右键 > 添加 > 后置处理器 > JSON提取器 2、JSON提取器参数说明 N…

chatgpt赋能python:Python如何删除行:从入门到精通

Python如何删除行:从入门到精通 在Python编程中,删除行是必不可少的操作之一。无论是清除不必要的数据,还是在数据集中删除重复行,或者在文本文件中删除某些行,删除行都是一项极其重要的任务。 什么是Python语言&…

Shell脚本攻略:文本三剑客之sed

目录 一、理论 1.sed 二、实验 1.sed命令的寻址打印 2.显示奇偶 3.查找替换 4.后向引用 一、理论 1.sed (1) 概念 sed 英文全称为stream editor流式编辑器,sed 对输入流(文件或来自管道的输入)执行基本文本转换单通过流,…

Matlab进阶绘图第22期—不等宽柱状图

不等宽柱状图是一种特殊的柱状图。 与常规柱状图相比,不等宽柱状图可以通过柱高与柱宽分别表达两个维度的数据,因此在多个领域得到应用。 在《Matlab论文插图绘制模板第91期》中,虽有介绍过利用Matlab自带bar函数绘制不等宽柱状图的方法&am…

高完整性系统(7)Formal Verification and Validation

文章目录 Specification Process 规格化过程State Invariants案例check ... expect Alloy是一种用于构建和检查抽象模型的语言和工具。当Alloy说所有断言都成立时,这意味着你的模型或规格在给定范围内已成功通过了所有的断言检查。换句话说,对于你所定义…

C#实例:多功能Windows窗体应用程序Helloworld_WinForm

有了创建一个Windows窗体应用程序的经验,就可以开始尝试运用更多的控件实现更多丰富的功能界面。以下分享我基于项目Helloworld_WinForm使用常用C#Windows窗体控件实现一些小功能。 每一节标题为所用到的控件,全文以实际制作过程为序编制。 目录 WinFor…

来了解一下白盒测试,黑盒测试,灰盒测试吧(超详解~)

根据被测对象的不同,软件测试可以分为白盒测试、黑盒测试、灰盒测试三种方式。那么,这三种测试方式具体是如何运行的?各有什么特点?下面,跟着静姐一起了解一下吧! 01、白盒测试 WHITE BOX ●概念&#x…

PACS影像解决方案

现代医学影像技术的迅猛发展,使得PACS系统已逐渐成为各级医院实现信息化建设的重要组成部分。医学影像技术的进步也提升了医学影像的清晰度,推动二维PACS向三维升级转变。这一切都使得医学影像数据量激增,加之医疗行业法规的数据保存要求&…

Android平台OpenCV入门

一、导入OpenCV 别忘记把libopencv_java3.so添加进来。 二、初始化 OpenCVLoader.initDebug();三、常用方法 1. CvType 数据类型 以CV_64FC2为例,64指64位,F指浮点数,C指通道,2为2通道。 数值具体类型取值范围CV_8U8 位无符…

软件工程导论(四)软件编码测试与维护

一、软件编程 1.1良好的编程习惯 变量命名有意义并且使用统一的命名规则 编写自文档代码(序言性注释 or 行内注释) 提前进行可维护性考量(可以用常量的方式存在的数值最好以变量的方式存在) 良好的视觉安排可以提高代码的可读性(…

SOLIDWORKS技巧培训-绘制零件滚花的两种方法

最近常有朋友咨询SolidWorks零件如何做滚花的效果,下面给大家整理了绘制零件滚花的一个培训教程: 作为机械设计师,滚花应该都不陌生,真要说起来,滚花绘制其实也不算难,跟着我们一步一步来,应该…

ThreeJS 炫酷特效旋转多面体Web页 Demo 01《ThreeJS 炫酷特效制作》

本案例为一个 threejs 的特效网页,大小球体进行包裹,外球体为透明材质,但是进行了线框渲染,使其能够通过外球踢查看其内球体。 注:案例参考源于互联网,在此做代码解释,侵删 本案例除 ThreeJS 外…

chatgpt赋能python:Python如何分割列表

Python如何分割列表 介绍 在Python编程中,列表是一种非常常见的数据类型。有时候我们需要将一个大的列表分割成几个小的列表,以便更好地处理数据。Python提供了多种方法来实现这个目的。在本文中,我们将介绍Python中如何分割列表的几种方法…