关于powermock
在TDD领域Mock框架有不少,好比EasyMock,JMock,Mockito。可能有些同窗会好奇了,为何要重点把powermock拿出来呢,由于powermock能够解决前面三种框架不能解决的问题,并且powermock也是是单元测试中极其强大的测试框架。html
powermock特色
- 主要围绕着Junit、TestNg测试框架开展进行
- 对所依赖的Jar包很是的苛刻,出现jar包的冲突或者不一致就不能使用
- PowerMock也是一种Mock,主要是解决其余Mock不能解决的问题,通俗的讲,就是专治各类不服
powermock入门实例
一、引入依赖jar包
<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>1.6.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.6.1</version> <scope>compile</scope> </dependency>
二、实际案例
模拟场景:新增学生操做数据库
先建一个名为StudentService的类,用来模拟服务调用操做,在这个类中新增一个方法,来模拟查询总共有多少个学生。api
具体示例代码以下:服务器
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao; /** * @author rongrong * @version 1.0 * @date 2019/11/17 21:13 */ public class StudentService { private StudentDao studentDao; public StudentService(StudentDao studentDao) { this.studentDao = studentDao; } /** * 获取学生个数 * * @param studentDao */ public int getTotal(StudentDao studentDao) { return studentDao.getTotal(); } }
能够看出建立service须要传递StudentDao这个类,接着咱们再来建立StudentDao这个类,用于进行新增操做。框架
具体示例代码以下:单元测试
package com.rongrong.powermock.dao; /** * @author rongrong * @version 1.0 * @date 2019/11/17 21:15 */ public class StudentDao { public int getTotal() { throw new UnsupportedOperationException(); } }
仔细看,你会发现,你确定调不了dao了,这回傻了吧,哈哈哈!!!测试
你会好奇这块为啥我要抛出UnsupportedOperationException异常呢,由于我就想模拟服务不可用的状况(实际中常常会遇到可能因为某种缘由(没有完成,或者资源不存在等)没法为 Service 服务),这样的状况,难道咱们就不测试了吗?this
那我仍是乖乖的把测试用例写完,并测试下吧,下面咱们再来建立一个名为StudentServiceTest的测试类。spa
具体示例代码以下:3d
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao; import org.testng.annotations.Test; /** * @author rongrong * @version 1.0 * @date 2019/11/17 21:19 */ public class StudentServiceTest { @Test public void testAddStudent() { StudentDao studentDao = new StudentDao(); StudentService studentService = new StudentService(studentDao); studentService.getTotal(studentDao); } }
上面的测试用例确定会执行失败,那咱们也来执行下看,效果以下图:
咱们先将这个报错,脑补为连接不上数据库,问题很明显,数据库挂了,就是链接不上了,等着服务器好了得三天后,但是今晚领导就要看功能实现,你该怎么办?没法测试service,难道就真的结束了吗?
答案是否认的,此时咱们用powermock即可完美解决问题,接下来咱们请出powermock登场。
具体代码以下:
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao; import org.powermock.api.mockito.PowerMockito; import org.testng.Assert; import org.testng.annotations.Test; /** * @author rongrong * @version 1.0 * @date 2019/11/17 21:19 */ public class StudentServiceTest { @Test public void testGetStudentTotal() { StudentDao studentDao = PowerMockito.mock(StudentDao.class); PowerMockito.when(studentDao.getTotal()).thenReturn(666); StudentService studentService = new StudentService(studentDao); int total = studentService.getTotal(studentDao); Assert.assertEquals(total, 666); } }
这时再次运行,你会发现神奇般的运行经过,结果以下图所示:
是否是很神奇,很惊喜,没错,这个框架就是这么强大。
咱们能够这样理解mock就是建立一个假的该对象,而后须要你告诉这个对象调用某个方法的时候返回某个你指定的值便可。
到此,一个简单powermock入门结束,如您以为好,请继续关注我,谢谢支持!
原文出处:https://www.cnblogs.com/longronglang/p/11878813.html