单元测试之mock使用

一、简介

 一般程序中A类的m1方法调用B类的m2方法,而B类的m2方法又调用了C类的m3方法以此类推等等,而其中的某个方法的一些数据又需要调用其它服务或者查询数据库,一般单元测试只针对某个功能进行测试,但是如上面的情况在做单元测试时受程序结构、环境等条件限制就会变得非常复杂。mock可以模拟对象返回方式来解决与该单元功能不相关的依赖关系,即模拟B类的m2方法返回结果来进行A类的m1方法单元测试,排除受到B类C类等其它不相关因素的影响。

二、使用mock做单元测试的优点

1、效率高

就是跑Java代码,不需要启用Spring及连接数据库。

2、TDD(测试驱动开发)

即先编写单元测试用例,根据单元测试用例再编写程序代码。

3、并行开发

团队有多个开发人员时在把数据格式约定好后可使用mock模拟返回结果而不需等待功能开发完成后才能联调。

4、解决环境依赖问题

比如当网络不通、服务无法访问时也能进行单元测试。

三、mock实现原理

使用Stub(桩)技术动态的替换原程序功能。即在程序运行时将原本程序要调用class字节码的逻辑替换为mock代码。

四、mock使用

1、导入Maven依赖包

 

<span style="background-color:#f8f8f8"><span style="color:#333333"><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>2.8.9</version><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>1.7.4</version><scope>test</scope></dependency><dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito2</artifactId><version>1.7.4</version><scope>test</scope></dependency></span></span>

2、编写测试代码

2.1、模块接口调用代码

2.2、模块业务处理代码

 2.3、mock单元测试代码

 

<span style="background-color:#f8f8f8"><span style="color:#333333">/*** create with Daniel* Date: 2022/4/12**/@RunWith(MockitoJUnitRunner.class)public class MockTest {//注入业务对象@InjectMocksprivate Service service;//使用Mock对象@Mockprivate FeignService feignService;/*** 测试方法* @author: Daniel* @date: 2022/4/12* @return void*/@Testpublic void tester(){//初始化动作MockitoAnnotations.initMocks(this);Mockito.when(feignService.doApi(Mockito.anyString())).thenReturn("我是Mock对象");String result = service.doSomething("name");System.out.println(result);}}</span></span>

运行结果

从上图可以发现在Service调用Feign方法时返回的不是Feign的功能代码逻辑,而是返回测试用例中Mock返回的代码,这样可有效的解决单元测试用例对环境依赖的问题。

2.4、mock的其它用法


<span style="background-color:#f8f8f8"><span style="color:#333333">        //方法多次调用返回不同的值Mockito.when(feignService.doApi(Mockito.anyString())).thenReturn("第一次调用").thenReturn("第二次调用");System.out.println(service.doSomething("name"));System.out.println(service.doSomething("name"));//Mock没有返回值方法Mockito.doNothing().when(feignService).noReturn();//模块异常情况Mockito.when(feignService.doApi(Mockito.anyString())).thenThrow(new RuntimeException("我是Mock异常"));try{service.doSomething("name");}catch (Exception e){System.out.println(e.getMessage());}</span></span>

运行结果

3、PowerMock使用 

PowerMock主要用于模拟静态方法的调用。

3.1、增加工具测试类

3.2、Mock测试类调整

 在类上加以下二个注解


<span style="background-color:#f8f8f8"><span style="color:#333333">@RunWith(PowerMockRunner.class)@PrepareForTest({MockUtils.class})</span></span>

添加测试代码


<span style="background-color:#f8f8f8"><span style="color:#333333">@Testpublic void testStatic(){PowerMockito.mockStatic(MockUtils.class);PowerMockito.when(MockUtils.check(Mockito.any())).thenReturn(true);System.out.println(MockUtils.check(null));System.out.println(MockUtils.check(1));System.out.println(MockUtils.check(new Object()));}</span></span>

运行结果

由些可见,无论传什么参数都永远返回True。 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末小卡片领取】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day9 | Java框架 | SpringBoot

Day9 | Java框架 | SpringBoot SpringBoot简介入门程序概述起步依赖 基础配置配置文件格式&#xff1a;3种yaml语法规则yaml数据读取三种格式 多环境启动配置文件参数命令行参数多环境开发控制&#xff1a;Maven & SpringBoot 多环境兼容 配置文件分类&#xff1a;4种 整合…

蓝桥杯4. Fizz Buzz 经典问题

题目描述 给定一个整数 NN&#xff0c;从 1 到 NN 按照下面的规则返回每个数&#xff1a; 如果这个数被 3 整除&#xff0c;返回 Fizz。如果这个数被 5 整除&#xff0c;返回 Buzz如果这个数能同时被 3 和 5 整除&#xff0c;返回 FizzBuzz。如果这个数既不能被 3 也不能被 5…

本地部署Llama 3.1大模型

Meta推出的Llama 3.1系列包括80亿、700亿、4050亿参数版本&#xff0c;上下文长度扩展至12.8万tokens&#xff0c;并增加了对八种语言的支持。 部署模型需要用到Ollama的一个工具&#xff0c;访问官方网站https://ollama.com 点击下载&#xff0c;选择下载你对应的操作系统下…

【无标题】Efinity 0基础进行流水灯项目撰写(FPGA)

文章目录 前言一、定义概念 缩写1. 二、性质1.2. 三、使用步骤编译常见错误1. 没加分号2. end 写多了 编译成功的标志总结参考文献 前言 数电课设 使用 FPGAIDE 使用 Efinity 一、定义概念 缩写 1. 二、性质 1. 2. 三、使用步骤 python代码块matlab代码块c代码块编译…

手把手带你拿捏C指针(2)(含冒泡排序)

文章目录 一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、冒泡排序五、二级指针六、指针数组七、指针数组模拟二维数组 一、数组名的理解 在上⼀个章节我们在使⽤指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,…

工信部【信创认证】全面解读,包含信创集成项目管理师,信创规划管理师等

行业背景 国资委发布79号文件&#xff1a;详细规划了中央企业和国有企业信创国产化的实施路径和时间表&#xff0c;明确提出了到2027年100%完成信创“替代”的宏伟目标。这一政策不仅涵盖了芯片、基础软件、操作系统、中间件等重要领域&#xff0c;更意味着从2023年起&#xf…

5天涨粉3W!26个视频12.2W粉!AI做这种视频这么火嘛?

前几天刷到一个AI视频的账号&#xff0c;当时刷到时候才9W粉丝&#xff0c;今天又刷到他&#xff0c;已经12.2W了&#xff01;这涨粉速度&#xff0c;简直了&#xff01;&#xff01; 26个视频&#xff0c;12.2万粉丝 在这个看脸的时代&#xff0c;内容创作者们为了吸引眼球&a…

3.js - 着色器设置点材质(螺旋星系特效)

上图 着色器设置点材质时&#xff0c;在顶点着色器中&#xff0c;最好设置gl_PointSize&#xff0c;不然看不到你在页面中添加的点 main.js import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlsimport gsap from gsapimp…

【截图服务 +打包】pkg打包 puppeteer

目录 最后结论 windows打包成服务 定制executablePath 用程序来查找chrome.exe 代替上面的写配置文件 服务遇到的问题 使用java开一个线程启动 遇到的问题与解决 版本匹配问题 打出包后的运行报错问题 linux下的安装 安装n 库缺少 程序运行后的报错 制作 运行报…

化工机械如何精准地进行网络营销推广?

合作咨询联系竑图 hongtu201988 化工机械行业该如何做网络推广&#xff0c;让销量和利润都有明显的提升呢&#xff1f;湖南竑图网络来为大家分析分析&#xff1a; 一、产品的用户是谁&#xff1f; 在传统行业中&#xff0c;用户群体的多样性不容忽视。比如机械设备有很多种&am…

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果&#xff1a; 解密后的数据就是正常数据&#xff1a; 后端&#xff1a;使用的是spring-cloud框架&#xff0c;在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30…

Kamailio-超强dispatcher负载均衡模块

Kamailio 负载均衡的功能主要依靠 Dispatcher 模块完成&#xff0c;模块官方文档参看 为什么要引入负载均衡&#xff1f;如何使用&#xff1f; 引入和配置功能路由调用命令行指令 为什么要引入负载均衡&#xff1f; Q: 如果单台VOIP服务的性能不能满足业务需求了&#xff0…

C++中的I/O流

本节主要看代码理解 I/O流继承关系 iostream 主要类 cin cout cerr clog while&#xff08;cin>>str&#xff09; &#xff5b; //处理 &#xff5d; 当接收ctrl z 或 ctrl c时&#xff0c;会停止&#xff0c; 原理&#xff1a;重载操作符bool&#xff0c;令指定istr…

Meta:大语言模型可以通过自我批判取得大幅提升!

夕小瑶科技说 原创 作者 | 谢年年 论文的审稿模式想必大家都不会陌生&#xff0c;一篇论文除了分配多个评审&#xff0c;最后还将由PC综合评估各位审稿人的reviews撰写meta-review。 最近&#xff0c;来自Meta的研究团队将这一模式引进到大模型的对齐训练中。模型同时扮演 执…

poker (GuanDan)

poker &#xff08;GuanDan&#xff09; 掼蛋 基础比大小规则: ①单牌 2最小与以往不太一样&#xff08;2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A < Joker&#xff09; 如果本级打9&#xff0c;那么9就比A大&#xff0c;…

安装Anaconda(过程)

Anaconda是一个开源的Python发行版本&#xff0c;用来管理Python相关的包&#xff0c;安装Anaconda可以很方便的切换不同的环境&#xff0c;使用不同的深度学习框架开发项目&#xff0c;本文将详细介绍Anaconda的安装。 一、安装 1、安装方式 官网&#xff1a;“https://www.…

JVM - GC垃圾回收

文章目录 目录 文章目录 1. 自动垃圾回收 1.1 垃圾回收区域 2. 方法区回收 3. 堆回收 3.1 对象已死&#xff1f; 3.1.1 引用计数算法 3.1.2 可达性分析算法 3.1.3 再谈引用 强引用 软引用 弱引用 虚引用 3.2 垃圾收集算法 3.2.1 分代收集理论 3.2.2 垃圾回收算…

FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules

新增优点&#xff1a;Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本&#xff0c;避免了多表多sink多次写 route 路由的麻烦&#xff0c;类似于统一前后缀的形式多表多sink&#xff0c;通过<>正则&#xff0c;大大减少了书写 官网&#xff1…

初始Linux 和 各种常见指令

目录 Linux背景 1. 发展史 Linux发展历史 1.历史 2. 开源 Linux下基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09;&#xff1a; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a; …

【Vue3】自动化路由配置:Vue3与unplugin-vue-router的完美结合

引言 在Vue3项目中&#xff0c;路由管理是构建复杂应用不可或缺的一部分。传统上&#xff0c;手动编写路由配置既繁琐又容易出错。本文将介绍如何利用unplugin-vue-router插件&#xff0c;实现Vue3项目的自动化路由配置&#xff0c;从而提升开发效率和准确性。 unplugin-vue-…