单元测试第七篇,在第六篇中,介绍了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相关推荐

  1. Java单元测试典型案例集锦

    前言 近期,阿里巴巴CTO线卓越工程小组举办了阿里巴巴第一届单元测试比赛<这!就是单测>并取得了圆满成功.本人有幸作为评委,在仔细地阅读了各个小组的单元测试用例后,发现了两大单元测试问题: ...

  2. 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试

    JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不 ...

  3. Java单元测试技巧之PowerMock

    简介: 高德的技术大佬向老师在谈论方法论时说到:"复杂的问题要简单化,简单的问题要深入化." 这句话让我感触颇深,这何尝不是一套编写代码的方法--把一个复杂逻辑拆分为许多简单逻辑, ...

  4. Java单元测试实践-08.Stub、Replace、Suppress静态方法

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Stub. ...

  5. Java单元测试实践-15.Stub、Replace、Suppress Spring的方法

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Stub. ...

  6. Java单元测试实践-06.Mock后Stub静态方法

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Mock后 ...

  7. Java单元测试实践-11.Mock后Stub Spring的@Component组件

    Java单元测试实践-00.目录(9万多字文档+700多测试示例) https://blog.csdn.net/a82514921/article/details/107969340 1. Sprin ...

  8. 使用JMockit编写java单元测试

    之前<有效使用Mock编写java单元测试>一文中层介绍过使用EasyMock和PowerMock来编写java单元测试,今天介绍一个更加强大的工具--JMockit. 引用单元测试中mo ...

  9. java面向对象程序设计题库_java面向对象程序设计习题集.doc

    java面向对象程序设计习题集.doc 1JAVA 面向对象程序设计习题集 23目 录引 言 .6第一章 JAVA 基础 7一.填空题 7二.判断题 9三.选择题 9四.程序阅读题 26第二章 控制结 ...

最新文章

  1. linux shell 执行多个文件,/etc/profile、~/.bash_profile等几个文件的执行过程
  2. 加密ASP为DLL的详细步骤给点RMB不多是个心意尊重脑力劳动者的付出
  3. 关于DPM(Deformable Part Model)算法中模型可视化的解释
  4. 得先好好研究一数据库
  5. TensorWatch 机器学习调试和可视化工具
  6. pymysql安装_jqdatasdk手动安装
  7. Java人脸识别登录案例(基于百度人脸识别AI)
  8. tomcat内存溢出的解决方法
  9. TypeError: can‘t convert cuda:0 device type tensor to numpy. Use Tensor.cpu()
  10. JAVA快递单号查询接口对接教程【快递鸟DEMO】
  11. 人生如逆旅,我亦是行人——与余光中先生握一次手(一)
  12. 《汇编语言程序设计》(双语)上机指导
  13. transform(转换)
  14. ARC 101 E - Ribbons on Tree
  15. SpringBoot-yaml语法规则和读取数据
  16. 弘辽科技:淘宝14天降权会恢复吗?多久能恢复正常?
  17. python循环批量读取tushare财务数据
  18. 如何办理护照(zt)
  19. 安搭Share:主播探店为实体店发展迎来新机遇
  20. 15_串口中断通信寄存器即库函数配置编写实例

热门文章

  1. 为什么工业设计要创新,工业设计创新的意义和作用
  2. 三层交换机【Vlanif详解】开启OSPF与路由器互通【eNSP实现】
  3. Python 3 转义字符表(带示例)
  4. 想要转行软件测试就得先搞清测试工程师的职责是什么?
  5. CVPR2022:使用完全交叉Transformer的小样本目标检测
  6. 凸优化第五章对偶 5.1 Lagrange对偶函数
  7. idea 字体行间距_idea
  8. H5页面唤醒App及App之间跳转
  9. uni-app中使用Towxml 3.0,小程序完美支持Markdown
  10. 带你一分钟了解对称加密和非对称加密