org.powermock
powermock-module-junit4
${powermock.version}
test
org.powermock
powermock-api-mockito
${powermock.version}
test
二、PowerMock实例介绍
1. Mock静态方法
项目开发过程中,经常会将比较通用的工具性质的方法抽象为一个工具类以便使用者进行调用。本小节讨论静态方法的Mock。
如上图代码所示,我们可以使用mockStatic这样的API来对静态方法进行模拟。
2. 方法中的新建对象Mock
在代码中常用注解来进行对象注入,但是实际开发中也会常用新建对象的方式进行对象
调用。那么在单元测试方法中也需要对其进行Mock以便于获取到自己需要的返回值。因为程序中存在根据新建对象所调用方法的返回值来决定不同程序分支的情况,根据Mock出来的对象不同的返回值有助于测试代码覆盖不同情况下的程序分支。
先Mock需要新建的类,再使用whenNew 的API来进行模拟。通过返回的Mock对象来代替程序中的新建对象来使用。
3. 私有方法的Mock
单元测试过程中对于私有方法的Mock常常是一件头疼的事情。有的时候我们甚至通过反射的方式来进行私有方法的单元测试。其实PowerMock中提供了私有方法的Mock方法。
图3 Mock私有方法一
其中checkExist为TestService类中的私有方法,通过这样的API实现对于私有方法的Mock。verifyPrivate用于检查类中的私有方法是否被调用。
另外一种Mock私有方法如下所示:
图4 Mock私有方法二
4. void方法Mock
对于void方法,由于它没有返回值,没有办法根据其返回值判断程序执行的结果。但是只要是方法,它执行过后肯定会产生效果。对代码执行后的效果进行判断也可以达到测试void方法的目的。在PowerMock中可以使用verify这个API来检测该void方法是否被调用。
图5代码中的checkExist方法为一个void方法,通过verify来检测该方法是否被调用。
5. 多次thenReturn的使用
在实际开发中会经常遇到同一个对象方法被多次调用,例如EF框架下的commonDao。
在单元测试的时候发现,如果按照commonDao被调用的顺序进行Mock,运行测试方法的时候会报错。具体错误为在第一次Mock该对象进行thenReturn返回一个需要的返回值,在第二次Mock该对象调用相同方法时会出现类型转换的错误。原因是第二次使用的Mock对象还是上一次Mock遗留下来的,所以在返回值的时候会产生类型不一致无法转换的错误。此时可以使用下图代码的方式。
图6 多次thenReturn调用
即在同一个mock方法中不断调用thenReturn方法,根据原先的代码逻辑,每次返回不同的查询对象。这样就会避免上述错误的发生。
6. spy的使用
Mock出来的对象其实是一个假的对象,它并不真正去执行对象的行为。那么有些情况
下,不真正执行方法无法检测程序运行效果。下面通过一个实例来进行说明,TestService类中包含一个创建txt文件write的方法。
图7 普通测试方法
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
*](https://bbs.csdn.net/topics/618164986)
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!