Java单元测试:使用PowerMockito库对方法进行进一步mock
单元测试第七篇,在第六篇中,介绍了mockito对public方法的mock,但是mockito不支持私有方法、静态方法等,因此,本文介绍PowerMockito库,它在mokito上进行增强,可以mock 静态方法、私有方法、final方法、enum、构造函数等等。
- 注:要使用PowerMockito,必须使用org.junit.Test,且class和method都必须是public
- 参考:https://github.com/powermock/powermock/issues/1030。
- 相关代码已经放在Github上:源代码
特别说明:
在很多地方,都强烈建议不使用该框架,大意就是如果需要对静态方法、私有方法、构造函数等进行mock,说明你的应用架构设计不合理,应该考虑重新设计你的业务实现。
下面简述开发过程:
1、首先,还是正常建立项目,并完成一些常规的业务逻辑开发;
2、项目添加mockito库的引用,打开pom.xml,添加:
<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.5.13</version><scope>test</scope>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope>
</dependency>
<dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>2.0.7</version><scope>test</scope>
</dependency>
<dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito2</artifactId><version>2.0.7</version><scope>test</scope>
</dependency>
注1:引用的库,包含第六篇里的mockito。
3、application.yml配置文件无需修改.
4、静态方法mock:
String name = "王霸";
Assert.isTrue(BusinessService.getHello1(name).equals("Hello1, 王霸"), "原生有问题?");PowerMockito.mockStatic(BusinessService.class);
PowerMockito.when(BusinessService.getHello1(ArgumentMatchers.any())).thenReturn("你好");
Assert.isTrue(BusinessService.getHello1("").equals("你好"), "mock有问题?");
5、构造函数mock:
BusinessService mockObj = PowerMockito.mock(BusinessService.class);
PowerMockito.when(mockObj.requestSinaHtml()).thenReturn("Mock新浪");// 如果创建 BusinessService对象时,传递了参数 abc,则返回mock对象
PowerMockito.whenNew(BusinessService.class).withArguments("abc").thenReturn(mockObj);// 创建对象,不符合mock条件,创建会失败
BusinessService noMock = new BusinessService("abcd");
Assert.isTrue(noMock == null, "原生方法?");// 创建对象,符合mock条件
BusinessService withMock = new BusinessService("abc");
Assert.isTrue(withMock.requestSinaHtml().equals("Mock新浪"), "Mock方法?");
6、私有方法mock:
BusinessService mockObj = PowerMockito.spy(new BusinessService());// 没mock前,调用原生方法
String tmp = mockObj.getHello2("ab");
Assert.isTrue(tmp.equals("Hello2, ab"), "原生有问题?");// mock私有方法
PowerMockito.when(mockObj, "getHelloPrivate", Mockito.anyString()).thenReturn("abc");tmp = mockObj.getHello2("ab");
Assert.isTrue(tmp.equals("abc"), "mock有问题?");
7、final方法mock:
BusinessService mockObj = PowerMockito.spy(new BusinessService());// 没mock前,调用原生方法
String tmp = mockObj.getHelloFinal("ab");
Assert.isTrue(tmp.equals("Hello, Final ab"), "原生有问题?");// mock final方法
PowerMockito.when(mockObj.getHelloFinal(Mockito.anyString())).thenReturn("abc");tmp = mockObj.getHelloFinal("ab");
Assert.isTrue(tmp.equals("abc"), "mock有问题?");
8、enum枚举mock:
BusinessService.EnumDemo mockObj = PowerMockito.mock(BusinessService.EnumDemo.class);// 没mock前,调用原生方法
String tmp = BusinessService.EnumDemo.enum2.getTitle();
Assert.isTrue(tmp.equals("ENUM2"), "原生有问题?");// mock enum2 方法
Whitebox.setInternalState(BusinessService.EnumDemo.class, "enum2", mockObj);
PowerMockito.when(mockObj.getTitle()).thenReturn("abc");// 返回mock后的值
tmp = BusinessService.EnumDemo.enum2.getTitle();
Assert.isTrue(tmp.equals("abc"), "mock有问题?");// 未mock
tmp = BusinessService.EnumDemo.enum3.getTitle();
Assert.isTrue(tmp.equals("ENUM3"), "mock有问题?");
注:以上代码,在提供的源码Demo里都有。
如果你在运行时有问题,可以下载上面的源码,进行对比,看看你的代码哪里有问题。
Java单元测试:使用PowerMockito库对方法进行进一步mock相关推荐
- Java单元测试典型案例集锦
前言 近期,阿里巴巴CTO线卓越工程小组举办了阿里巴巴第一届单元测试比赛<这!就是单测>并取得了圆满成功.本人有幸作为评委,在仔细地阅读了各个小组的单元测试用例后,发现了两大单元测试问题: ...
- 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试
JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不 ...
- Java单元测试技巧之PowerMock
简介: 高德的技术大佬向老师在谈论方法论时说到:"复杂的问题要简单化,简单的问题要深入化." 这句话让我感触颇深,这何尝不是一套编写代码的方法--把一个复杂逻辑拆分为许多简单逻辑, ...
- Java单元测试实践-08.Stub、Replace、Suppress静态方法
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Stub. ...
- Java单元测试实践-15.Stub、Replace、Suppress Spring的方法
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Stub. ...
- Java单元测试实践-06.Mock后Stub静态方法
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Mock后 ...
- Java单元测试实践-11.Mock后Stub Spring的@Component组件
Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Sprin ...
- 使用JMockit编写java单元测试
之前<有效使用Mock编写java单元测试>一文中层介绍过使用EasyMock和PowerMock来编写java单元测试,今天介绍一个更加强大的工具--JMockit. 引用单元测试中mo ...
- java面向对象程序设计题库_java面向对象程序设计习题集.doc
java面向对象程序设计习题集.doc 1JAVA 面向对象程序设计习题集 23目 录引 言 .6第一章 JAVA 基础 7一.填空题 7二.判断题 9三.选择题 9四.程序阅读题 26第二章 控制结 ...
最新文章
- linux shell 执行多个文件,/etc/profile、~/.bash_profile等几个文件的执行过程
- 加密ASP为DLL的详细步骤给点RMB不多是个心意尊重脑力劳动者的付出
- 关于DPM(Deformable Part Model)算法中模型可视化的解释
- 得先好好研究一数据库
- TensorWatch 机器学习调试和可视化工具
- pymysql安装_jqdatasdk手动安装
- Java人脸识别登录案例(基于百度人脸识别AI)
- tomcat内存溢出的解决方法
- TypeError: can‘t convert cuda:0 device type tensor to numpy. Use Tensor.cpu()
- JAVA快递单号查询接口对接教程【快递鸟DEMO】
- 人生如逆旅,我亦是行人——与余光中先生握一次手(一)
- 《汇编语言程序设计》(双语)上机指导
- transform(转换)
- ARC 101 E - Ribbons on Tree
- SpringBoot-yaml语法规则和读取数据
- 弘辽科技:淘宝14天降权会恢复吗?多久能恢复正常?
- python循环批量读取tushare财务数据
- 如何办理护照(zt)
- 安搭Share:主播探店为实体店发展迎来新机遇
- 15_串口中断通信寄存器即库函数配置编写实例