当前位置: 首页 > news >正文

Junit单元测试笔记

常用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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 继承的初始化顺序
  • 解析Java中1000个常用类:ServiceLoader类,你学会了吗?
  • SpringBoot工厂模式
  • 【重点】人工智能大语言模型技术发展研究报告2024|附下载
  • 旅游社交小程序的设计
  • 借题《黑神话悟空》,聊聊UE5 游戏开发中基本的 C++ 概念
  • 如何在分布式环境中实现高可靠性分布式锁
  • 我在某日重新下载了idea
  • Vue中字节流格式的 Base64编码转换为 Blob 对象保存成wav的音频文件
  • Jmeter性能关注指标详解
  • Day18_Netty
  • Spark MLlib 特征工程系列—特征转换SQLTransformer
  • 数学建模学习(127):基于Python的模糊最佳-最差法(Fuzzy BWM)在多准则决策中的应用
  • 8.20-ansible剧本的使用+roles的应用
  • 书橱系统小程序的设计
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 《Java编程思想》读书笔记-对象导论
  • JavaScript学习总结——原型
  • JAVA之继承和多态
  • linux安装openssl、swoole等扩展的具体步骤
  • Vultr 教程目录
  • 高度不固定时垂直居中
  • 理解在java “”i=i++;”所发生的事情
  • 前端面试之闭包
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • AI算硅基生命吗,为什么?
  • 阿里云API、SDK和CLI应用实践方案
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 仓管云——企业云erp功能有哪些?
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​Python 3 新特性:类型注解
  • ​卜东波研究员:高观点下的少儿计算思维
  • # Redis 入门到精通(一)数据类型(4)
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #07【面试问题整理】嵌入式软件工程师
  • #pragma pack(1)
  • (1)svelte 教程:hello world
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (分布式缓存)Redis哨兵
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (推荐)叮当——中文语音对话机器人
  • .htaccess配置常用技巧
  • .NET CF命令行调试器MDbg入门(一)
  • .net CHARTING图表控件下载地址
  • .net操作Excel出错解决
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net语言中的StringBuilder:入门到精通
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /3GB和/USERVA开关
  • @Not - Empty-Null-Blank
  • [001-03-007].第07节:Redis中的事务
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作