单元测试3.0+ @RunWith(JMockit.class)+mock+injectable+Expectations

Jmockit使用笔记_基本功能使用@Tested_@Injectable_@Mocked_Expectations_jmockit.class-CSDN博客

静态变量直接赋值就好,没必要mock了 

测试框架Jmockit集合junit使用

@RunWith(JMockit.class)

在测试案例类上的注解

@Tested

在测试案例中,写在我们要测试的类上面, 一般用实现类

@Injectable

在测试案例中声明那些我们要测试的类中通过@Autowired注入的类
                        
原文链接:https://blog.csdn.net/Java_XiaoBei/article/details/126150129

/*** @author: xinruoxiangyang9010* 测试案例*/
@RunWith(JMockit.class)
public class MyServicemplTest {@Injectableprivate MyMapper myMapper;@Testedprivate MyServicempl myServicempl;@Testpublic void testMethod() {String result = myServicempl.testMethod();assertEquals("myService", result);}
}

2. 必须加 @RunWith(JMockit.class) 的情况

  • 使用 JUnit 4
    如果你的项目是基于 JUnit 4 的测试框架,而测试类中使用了 JMockit 提供的注解(如 @Mocked@Injectable)或 API(如 ExpectationsVerifications),则必须加上 @RunWith(JMockit.class)
    原因
    JUnit 4 默认使用 BlockJUnit4ClassRunner 运行器,而 JMockit 的特性需要通过 JMockitTestRunner 扩展运行器支持。如果不加 @RunWith(JMockit.class),JMockit 的增强功能不会生效。

测试类中不使用 JMockit 特性
如果你的测试没有使用 JMockit 的 @Mocked@Injectable@Tested 或其他功能,只是普通的单元测试,则可以不加 @RunWith(JMockit.class)。 

Expectations:返回他的result 

在 JMockit 的 Expectations 中,如果没有为方法设置返回值(result),或将 result 设置为 null,则会根据方法的签名返回以下内容:


1. 没有指定 result 的情况

new Expectations(MyStringUtil.class) {{MyStringUtil.getUUID(); // 没有设置 result
}};
String resultString = MyStringUtil.getUUID();
assertEquals(null, resultString); // 返回 null

  • 如果没有显式设置 result默认行为是方法返回类型的默认值
    • 基本类型(如 intdouble):返回其默认值(00.0)。
    • 对象类型:返回 null
    • void 方法:不会有返回值。

------------------

  • 如果是void 方法不能设置 result 值,因为它不返回任何内容。
  • 如果你尝试为 void 方法设置 result,JMockit 会抛出异常。java.lang.IllegalArgumentException: Attempted to specify a result for a void method.
  • 对于 void 方法,你可以使用 Verifications 来验证方法的调用行为。
@Test
public void voidMethodTest() {new Expectations() {{// 模拟任何期望,但不设置返回值MyStringUtil.doSomething();}};// 调用 void 方法MyStringUtil.doSomething();// 验证 void 方法是否被调用new Verifications() {{MyStringUtil.doSomething();  // 验证是否调用times = 1;  // 验证调用次数}};
}

这段代码就是检查doSomething()是否调用了1次,times=2就是检查是否用了两次

下面这段代码太好了:

结合Expectations的使用对@Mocked与@Injectable的不同

/*** @author: xinruoxiangyang9010* 测试案例*/
@RunWith(JMockit.class)
public class MockAndInjectTest {@Testpublic void testMock(@Mocked DiffServiceImpl diffService) {new Expectations() {{diffService.method();result = "mockMethod";}};assertEquals("mockMethod", diffService.method());// @Mocked修饰的变量,即便是再new出来的,也会按照上面我们mock的结果返回assertEquals("mockMethod", new DiffServiceImpl().method());}@Testpublic void testInjectable (@Injectable DiffServiceImpl diffService) {new Expectations() {{diffService.method();result = "mockMethod";}};assertEquals("mockMethod", diffService.method());// 注意这里结果的不同, 在对@Injectable修饰的对象进行Expectations指定结果时// 受影响的只是被修饰的对象,如果我们new一个示例出来,是不会受Expectations影响的assertEquals("real", new DiffServiceImpl().method());}
}

这里写的也很好 

JMockit单元测试详解-CSDN博客

基本流程

record(录制)---- replay(回放) ---- verify(验证)

record : 设置将要被调用的方法和返回值。

  • Expections中的方法至少被调用一次,否则会出现missing invocation错误。调用次数和调用顺序不限。
  • StrictExpectations中方法调用的次数和顺序都必须严格执行。如果出现了在StrictExpectations中没有声明的方法,会出现unexpected invocation错误。

replay:调用(未被)录制的方法,被录制的方法调用会被JMockit拦截并重定向到record阶段设定的行为。

verify:基于行为的验证,测试CUT是否正确调用了依赖类,包括:调用了哪些方法;通过怎样的参数;调用了多少次;调用的相对顺序(VerificationsInOrder)等。可以使用times,minTimes,maxTimes来验证。

 

RunWith(JMockit.class): 指定单元测试的执行类为JMockit.class。
Tested: 指定被测试类,同时mock实例并注入测试类;依赖的类使用Injectable注入。
Injectable: 将对象进行mock并注入测试类。
Mocked:mock一种类型,并注入测试类。

Mocked与Injectable区别:

  • Mocked 注入的依赖,类的所有实例都被mock,record的方法,在replay时,按照record的结果返回;没有record的方法返回默认值。
  • Injectable 注入的依赖,只mock指定的实例,record的方法,在replay时,按照record的结果返回;没有record的方法返回默认值。没有mock的实例,调用其原始方法。

 

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

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

相关文章

PADS Logic原理图中有很多页原理图,如何(怎样)删除其中一页或者多页

我们在进行PADS Logic进行原理图设计的时候,有时候可能遇到一次性设计了很多页的原理图,比如说十几页的原理图。那么我们在进行PADS Layout的时候,可能将这些原理图绘制两块板或者多块PCB板,那么这时候我们需要将其中的一张原理图…

Elasticsearch 创建索引 Mapping映射属性 索引库操作 增删改查

Mapping Type映射属性 mapping是对索引库中文档的约束,有以下类型。 text:用于分析和全文搜索,通常适用于长文本字段。keyword:用于精确匹配,不会进行分析,适用于标签、ID 等精确匹配场景。integer、long…

《GICv3_Software_Overview_Official_Release_B》学习笔记

1.不同版本的 GIC 架构及其主要功能如下图所示: 2.GICv2m(Generic Interrupt Controller Virtualization Model)是针对ARM架构的GIC(通用中断控制器)的一种扩展, GICv2m扩展为虚拟化环境中的中断管理提供了…

【QT】找不到qwt_plot.h

系统环境: linux 20.04 qt 6.7.2 cmake 3.22 原因: Qwt没有正式的FindQwt.cmake,Qwt也没有提供QwtConfig.cmake。而且cmake不支持qmake的配置特性,也不支持读取mkspecs (.prf)文件。也就是说cmake构建的qt项目不可用qwt。 解决步…

杰发科技——使用ATCLinkTool解除读保护

0. 原因 在jlink供电电压不稳定的情况下,概率性出现读保护问题,量产时候可以通过离线烧录工具避免。代码中开了读保护,但是没有通过can/uart/lin/gpio控制等方式进行关闭,导致无法关闭读保护。杰发所有芯片都可以用本方式解除读保…

远程主机执行脚本1、无脚本内容外协。

使用 ssh rootyour_host bash -c "source <(cat)" < your_scripts.sh 或类似的命令来远程执行脚本&#xff0c;而不让脚本内容外泄或不让其他人看到脚本信息的原因通常是为了安全性和隐私保护。以下是几种考虑&#xff1a; 安全性&#xff1a;通过直接将脚本内…

Sublime Text4 4189 安装激活【 2025年1月3日 亲测可用】

-----------------测试时间2025年1月3日------------------- 下载地址 官方网址&#xff1a;https://www.sublimetext.com 更新日志&#xff1a;https://www.sublimetext.com/download V4189 64位&#xff1a;https://www.sublimetext.com/download_thanks?targetwin-x64 ....…

[python]实现可以自动清除过期条目的缓存

由于有缓存图片验证码的需要&#xff0c;所以我找了一些开源的缓存想直接使用&#xff0c;结果要么太老旧&#xff0c;要么太复杂&#xff0c;要么和 fastAPI 整合有问题&#xff0c;所以才想到自己写一个简单的&#xff0c;够用就好。 本文讲述了如何实现一个简单的内存缓存&a…

前后端规约

文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…

Windows 11 系统中npm-cache优化

在 Windows 11 系统中&#xff0c;C:\Users\K\AppData\Local\npm-cache 文件夹是 npm&#xff08;Node Package Manager&#xff09; 用于缓存已下载的包的目录。缓存的存在可以加快包的安装速度&#xff0c;因为当再次安装相同的包时&#xff0c;npm 可以直接从缓存中获取&…

linux安装redis及Python操作redis

目录 一、Redis安装 1、下载安装包 2、解压文件 3、迁移文件夹 4、编译 5、管理redis文件 6、修改配置文件 7、启动Redis 8、将redis服务交给systemd管理 二、Redis介绍 1、数据结构 ①字符串String ②列表List ③哈希Hash ④集合Set ⑤有序集合Sorted Set 2、…

在线RSA pem 密钥pkcs1转pkcs8格式--支持公钥和私钥

具体前往&#xff1a;在线RSA密钥pkcs1转pkcs8--在线将RSA私钥/公钥的pkcs1格式转换到pkcs8格式,支持pem格式

修复OpenLinkSaas客户端在使用AtomGit账号时页面崩溃

问题描述&#xff1a;当一个新的AtomGit用户登录OpenLinkSaas客户端后出现了页面崩溃。 从浏览器控制台来看&#xff0c;是gitNoticeList出现了null。 查看代码后发现是请求atomGit api是返回的一个null的列表 接下来我们加下保护性的代码&#xff0c;来兼容null或undefine的情…

rocketmq-pull模式-消费重平衡和拉取PullTaskImpl线程

1、观察consumer的线程模型 使用arthas分析 MQClientFactoryScheduledThread 定时任务线程 &#xff08;和push模式一致&#xff09; 定时任务线程&#xff0c;包含如下任务&#xff1a; 每2分钟更新nameServer列表 每30秒更新topic的路由信息 每30秒检查broker的存活&#x…

Ungoogled Chromium127 编译指南 MacOS 篇(二)- 项目要求

1. 引言 在开始编译 Ungoogled Chromium 之前&#xff0c;我们需要确保系统满足所有必要的硬件和软件要求。由于浏览器编译是一个资源密集型的任务&#xff0c;合适的硬件配置和完整的软件环境至关重要。本文将详细介绍编译 Ungoogled Chromium 所需的各项要求。 2. 硬件要求…

51单片机——共阴数码管实验

数码管中有8位数字&#xff0c;从右往左分别为LED1、LED2、...、LED8&#xff0c;如下图所示 如何实现点亮单个数字&#xff0c;用下图中的ABC来实现 P2.2管脚控制A&#xff0c;P2.3管脚控制B&#xff0c;P2.4管脚控制C //定义数码管位选管脚 sbit LSAP2^2; sbit LSBP2^3; s…

调试:用电脑开发移动端网页,然后用手机真机调试

一、背景 电脑开发移动端&#xff0c;然后想真机调试... 二、实现 2.1、电脑和手机链接相同局域网 2.2、pnpm run dev 启动项目 2.3、浏览器访问 localhost:3001/login 2.4、Windowsr 输入cmd&#xff0c;在cmd输入 ipconfig 2.5、浏览器访问 ip地址加/login 2.6、手机端…

Kbuild学习知识点

1.Kbuild本质&#xff1a;一个可扩展、可配置的Makefile框架&#xff0c;递归式Makefile&#xff0c;菜单式配置。 2.Kbuild构成&#xff1a; Makefile:顶层目录下的Makefile.config:内核的配置文件arch/S(ARCH)/Makefile:跟平台架构相关的Makefilescripts/Makefile.*:通用编…

《Vue3实战教程》39:Vue3无障碍访问

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 无障碍访问​ Web 无障碍访问 (也称为 a11y) 是指创建可供任何人使用的网站的做法——无论是身患某种障碍、通过慢速的网络连接访问、使用老旧或损坏的硬件&#xff0c;还是仅处于某种不方便的环境。例如&#xff0c;…

抢先体验:人大金仓数据库管理系统KingbaseES V9 最新版本 CentOS 7.9 部署体验

一、简介 KingbaseES 是中国人大金仓信息技术股份有限公司自主研发的一款通用关系型数据库管理系统&#xff08;RDBMS&#xff09;。 作为国产数据库的杰出代表&#xff0c;它专为中国市场设计&#xff0c;广泛应用于政府、金融、能源、电信等关键行业&#xff0c;以高安全性…