Junit单元测试笔记

news2024/11/23 11:42:24

常用mock类框架

在软件测试和开发过程中,Mock框架扮演着至关重要的角色,它们允许开发者模拟对象的行为,以便在不需要实际依赖的情况下进行测试。以下是一些常用的Mock框架:

  1. Mockito
  2. PowerMock
  3. EasyMock
  4. JMock
  5. Spock

初始化mock/spy对象的两种方式

  1. Mockito.mock(Class),Mockito.spy(Class)
  2. 注解方式:@Mock, @Spay

image-20240825121219369

image-20240825121455495

Mock对象默认返回值

mock对象默认不会调用真实方法,直接返回mock对象的默认值:

  • int

  • null(UserVo)

  • 空集合(List)

参数匹配

ArgumentMatcher.any拦截任意类型的参数

除了any,还有anyXXX(anyLong,anyString…)

指定返回值

  1. doReturn(returnObj).when(mockObject).someMethod(someArg);
  2. when(mockObject.someMethod(someArg)).thenReturn(returnObj);

void返回值方法插桩

doNothing().when(mockObject).someMethod(someArg);

插桩的两种方式

  1. when(obj.someMethod()).thenXxx();其中obj可以是mock对象
  2. doXxx().when(obj).someMethod();其中obj可以是mock/spy对象

注意:

spy对象在没有插桩时是调用真实方法的,写在when…then中会导致先执行一次原方法,达不到mock的目的。

需使用doXxx().when().someMethod()的方式。

如果用到了spy,推荐使用第二种方式,或者不管是Mock还是Spy都用第二种方式。

image-20240825103520453

抛出异常

  1. doThrow(SomeException.class).when(mockObj).someMethod();
  2. when(mockObj.someMethod()).thenThrow(SomeExcetion.class);

多次插桩

when(mockObj.someMethod()).thenReturn(returnObj1).thenReturn(returnObj2).then(returnObj3);

用这种流式的写法,在下面调用这个mock对象的对应的方法时会依次返回设置的返回值。

或者简写为:

when(mockObj.someMethod()).thenReturn(returnObj1,returnObj2,returnObj3);

image-20240825104643190

实现指定逻辑的插桩

可以使用thenAnswer实现指定逻辑的插桩,示例如下,个人觉得这种场景比较少。

image-20240825105101260

执行真正的原始方法

  • mock对象默认不执行原始方法。

​ 用when(mockObj.someMethod()).thenCallRealMethod()的方式执行原始方法。

  • spy对象默认就会调用真实的方法

  • 可以不让spy对象调用真实方法

    doReturn(returnObj).when(spyObj).someMethod();//指定了返回值就不用调用真实的方法了

示例:

image-20240825105637211

verify的使用

  • 验证调用过1次或几次
  • verify(mockObj).someMethod();

验证调用过1次这个方法

  • verify(mockObj, times(1)).someMethod();

此时与上面的等价,但是可以修改times()的参数值,写几就代表验证调用几次。

  • 验证没有调用过

verify(mockObj, never()).someMethod();

或者

verify(mockObj, times(0)).someMethod();

  • 验证最少或最多调用多少次
  • verify(mockObj, atLeast(1)).someMethod();

  • verify(mockObj, atMost(1)).someMethod();

image-20240825110110415

@InjectMocks注解的使用

  • 被@InjectMocks标注的属性必须是实现类,因为mockito会创建对应的实例对象

  • 默认创建的对象是未经过mockito处理的普通对象,因此常配合@Spy注解使其变成默认调用真实方法的mock对象

  • 被@InjectMocks标注的属性需要用到mock/spy对象,mockito会自动使用当前类里的mock或spy成员按类型或名称注入

    原理:构造器注入、setter注入、字段反射注入

image-20240825112122390

注意:

@InjectMocks不能注入父类的属性

几种常用的断言工具

image-20240825112812211

示例:

image-20240825112854906

自动生成单元测试类的插件

idea插件:squaretest插件

image-20240825120110131
在这里插入图片描述

image-20240825120539186

选择一个生成的模板:

image-20240825120712923

静态方法的Mock

image-20240824171127213

mock静态类的话需要释放资源,如果不释放资源的话,后面还有对这个类进行mock操作会报错

image-20240824175517979

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

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

相关文章

解决ONENOTE复制文字到外部为图片(Ditto)

默认情况下,在ONENOTE中记录的文字,在复制粘贴到外部时,会成为一张图片格式 如下图这段文字,粘贴到QQ中变为了图片 解决办法:安装Ditto Ditto下载链接 点击Download下载 双击安装.exe,选择安装路径后&…

JVM上篇:内存与垃圾回收篇-07-方法区

笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机) 文章目录 7. 方法区7.1. 栈、堆、方法区的交互关系7.2. 方法区的理解7.2.1. 方法区在哪里?7.2.2. 方法区的基本理解7.2.3. HotSp…

编译 wolfssl 库

wolfssl github: https://github.com/wolfSSL/wolfssl 编译 .lib 或者 .dll wolfssl 很好的提供了 win32 的工程》sln 文件 这样就不用折腾 CMakeLists 文件了,使用 Visual Studio 打开 sln 文件后,设置好 Static 编译库即可,开箱即用 编译 .…

项目开始后,拒绝客户提出的新需求是否会违约?

大家好,我是不会魔法的兔子,在北京从事律师工作,日常分享项目管理风险预防方面的内容。 序言 当一个项目已经开展后,对于项目组而言,最难以忍受的可能要数需求突然发生变化了,尤其是在项目已经进行一半或…

【Netty】Netty时间轮实践与源码解析

目录 定时任务JDK定时任务Timer原理 ScheduledThreadPoolExecutor 时间轮算法netty时间轮架构 netty时间轮 源码解析基本使用HashedWheelTimer 初始化createWheel 创建HashedWheelBucket数组 newTimeout 添加任务执行任务时间轮的优缺点 品一品优秀设计实际的生产环境选择 定时…

css中块,行内块,行内元素转换

参考 元素作用范围 块元素 会在显示时自动换行,例如p标签div等 行内元素 例如span,可以认为是一个不换行的块,其他还有label等 行内块元素 例如img标签显示图片,但不换行 区别 块元素可以设置宽高,但行元素不…

C/C++语言基础--结构体知识详解(包括:结构体数组、字节对齐、位段等内容)

本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 C语言地结构体是核心内容之一,他运行自定义数据类型,可以将不同地数据类型当作成一个整体,变成一个数据类型,运用及其广泛欢迎点赞 收藏 关注,本…

UE管理内容 —— Alembic File Importer

目录 从Maya导出ABC缓存 导入ABC到UE 导入为静态网格体 导入为几何体缓存 导入为Skeletal Alembic文件格式(.abc)是一个开放的计算机图形交换框架,将复杂的动画化场景浓缩成一组非过程式的、与应用程序无关的烘焙几何结果;可以在外部自由地创建复杂…

如何查看ubuntu版本

在当前的技术环境中,了解操作系统的具体版本对于用户来说至关重要。这不仅能确保软件兼容性,还有助于进行系统管理和故障排查。对于使用Ubuntu系统的用户来说,有几种不同的方法可以查看当前系统的版本。下面将详细介绍如何查看您的Ubuntu系统…

CSS文本样式(二)

一、水平对齐文本 1、text-align属性 text-align​属性指定元素中文本的​水平对齐方式​。 默认情况下,您网站上的文字左对齐。 但是,有时您可能需要不同的对齐方式。 文本对齐属性值如下:​left​,​right​,​cen…

数据结构(Java实现):链表与LinkedList

文章目录 1. 单向链表1.1 链表的概念及结构1.2 链表的实现1.2.1 单向链表类和节点1.2.2 打印每个节点的值1.2.3 计算链表长度1.2.4 头插节点1.2.5 尾插节点1.2.6 在指定下标插入新节点1.2.7 判断是否存在某个节点1.2.8 移除某个节点1.2.9 移除所有指定节点1.2.10 清空链表1.2.1…

【Linux:管道】

进程间通信背景: 每一个进程想要访问物理内存,都是通过访问进程虚拟地址空间当中的虚拟地址进行访问,访问时,通过各自的页表结构,造成了每一个进程和每一个进程的数据独立,由于进程独立性的存在&#xff0c…

Java | Leetcode Java题解之第373题查找和最小的K对数字

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {int m nums1.length;int n nums2.length;/*二分查找第 k 小的数对和的大小*/int left nums1[0] nums2[0];int right nums…

Github 2024-08-25 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-08-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1Laravel: 以优雅语法简化Web开发 创建周期:4028 天开发语言:PHP协议类型:MIT LicenseStar数量:30824 个Fork数量:1052…

windows安装wsl,出现错误WslRegisterDistribution failed with error: 0x8007019e的解决方案

错误WslRegisterDistribution failed with error: 0x8007019e 笔者直接从Microsoft Store 安装 WSL后&#xff0c;没有其他操作&#xff0c;直接打开WSL&#xff0c;结果出现Error: 0x8007019e错误提示&#xff1a; Error 0x8007019e 解决方案 &#xff08;1&#xff09;Win…

滑块自动化分析

大家好!我是炒青椒不放辣,关注我,收看每期的编程干货。 滑块分析是爬虫工程师进阶必备技能,当我们遇到一个问题时可能会有多种解决途径,而如何做出高效的抉择和完善的解决流程又需要经验的积累。本期文章将以实战的方式,带你使用 playwright 进行滑块分析,不仅会告诉你应…

iPhone抹掉数据后能恢复吗?详解数据恢复的可能性与方法

在使用iPhone的过程中&#xff0c;有时候我们会因为各种原因选择“抹掉所有内容和设置”&#xff0c;以期望将手机恢复到出厂状态。然而&#xff0c;一旦执行了这个操作&#xff0c;很多用户就会开始担心&#xff1a;iPhone抹掉数据后&#xff0c;这些数据还能恢复吗&#xff1…

VMware安装Ubuntu20.04

1. 下载 整理的镜像链接 阿里网盘&#xff1a;阿里云盘快传 2. 新建虚拟机向导 选择自定义&#xff0c;然后下一步。 默认配置&#xff0c;下一步。 选择稍后安装操作系统&#xff0c;下一步。 选择操作系统Linux&#xff0c;版本Ubuntu64位&#xff0c;下一步。 给虚拟机命名…

2534. 乘方 [CSP-J 2022]

代码 #include<bits/stdc.h> using namespace std; int main() {long long n,m,i,sum1;cin>>n>>m;for(i1;i<m;i){sum*n;if(sum>1000000000){cout<<-1;return 0;;}}cout<<sum;return 0; } 记得点赞关注收藏&#xff01;&#xff01;&…

根据股票列表获取资金流入情况

获取股票列表 作为演示&#xff0c;以创业板为例&#xff08;数据不多&#xff09;&#xff0c;我们通过自编的 get_stock_list 方法获取股票列表&#xff1a; import pandas from bad import BigAData from tqdm.notebook import tqdmplate cyb bad BigAData() json bad.…