在TDD领域Mock框架有很多,比如EasyMock,JMock,Mockito。可能有些同学会好奇了,为什么要重点把PowerMock拿出来呢,因为PowerMock可以解决前面三种框架不能解决的问题,而且PowerMock也是是单元测试中极其强大的测试框架。
PowerMock特点
主要围绕着Junit、TestNg测试框架开展进行 对所依赖的Jar包非常的苛刻,出现jar包的冲突或者不一致就不能使用!
PowerMock也是一种Mock,主要是解决其他Mock不能解决的问题,通俗的讲,就是专治各种不服!
PowerMock入门实例
1、引入依赖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>
2、实际案例
模拟场景:新增学生操作
先建一个名为StudentService的类,用来模拟服务调用操作,在这个类中新增一个方法,来模拟查询总共有多少个学生。
具体示例代码如下:
package com.rongrong.powermock.service;import com.rongrong.powermock.dao.StudentDao;/** * @author longrong.lang * @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 longrong.lang * @version 1.0 * @date 2019/11/17 21:15 */public class StudentDao { public int getTotal() { throw new UnsupportedOperationException(); }}
仔细看,你会发现,你肯定调不了dao了,这回傻了吧,哈哈哈!!!
你会好奇这块为啥我要抛出UnsupportedOperationException异常呢,因为我就想模拟服务不可用的情况(实际中经常会遇到可能由于某种原因(没有完成,或者资源不存在等)无法为 Service 服务),这样的情况,难道我们就不测试了吗?
那我还是乖乖的把测试用例写完,并测试下吧,下面我们再来创建一个名为StudentServiceTest的测试类。
具体示例代码如下:
package com.rongrong.powermock.service;import com.rongrong.powermock.dao.StudentDao;import org.testng.annotations.Test;/** * @author longrong.lang * @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 longrong.lang * @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入门结束