一、PowerMock 介绍
1.1、PowerMock 不是重复发明轮子
在 Java 的 TDD 领域已经有如此多的 Mock 框架,比如 EasyMock,JMock,Mockito为什么还要有 PowerMock 的存在,上述三个已经有重复发明轮子的嫌疑,为什么还要大家去使用 PowerMock 呢?
其实 PowerMock 并不是重发发明轮子,他的出现只是为了解决上述三种框架根本没有办法完成的工作,比如 Mock 一个 Static 方法等等,更多的将 PowerMock 理解为对现有 Mock 框架的扩展和进一步封装是比较贴切的,PowerMock 现在目前提供了两套 UT(Unit Test)框架的封装,请看下图。
PowerMock 主要围绕着 Junit 测试框架和 TestNg 测试框架进行,其中在每个框架下面对所涉及的 Mock 框架仅仅支撑 EasyMock 和 Mockito,为什么要画这个图呢,是因为PowerMock 对所依赖的 Jar 包非常的苛刻,如果出现某个依赖包的冲突或者不一致都会出现不能使用的情况,因此根据您的喜好和擅长,请选择官网上提供的 PowerMock 套件,
本文中采用的是 Junit+PowerMock+Mockito 这样的组合来进行讲述的。
1.2、PowerMock 解决了什么问题
那么到底 PowerMock 解决了哪些问题,PowerMock 的官方文档说的非常的清楚,他们解决了如下的问题.
PowerMock is a framework that extend other mock libraries such as EasyMock with morepowerful capabilities. PowerMock uses a custom classloader and bytecode manipulation toenable mocking of static methods, constructors, final classes and methods, private methods,removal of static initializers and more.
使用过 EasyMock 或者 Mockito 的人应该非常清楚,他们两个无法完成对 final 类型的 class 和 method 的 mock 操作,不能完成对类方法(static)的 mock,不能完成对局部变量的 mock 等等,PowerMock 的出现就是为了解决诸如此类的问题,简言之就是专治各种不服。
1.3、如何获得 PowerMock
您可以在 PowerMock 的官方网站免费获得测试组件,我之前说过 PowerMock 对所依赖的 library 有些苛刻,因此最好还是老老实实用它提供的套件包,如下所示,您可以下载我红色标注出来的测试套件。
如果您是 Maven 的忠实用户,您可以用将如下的配置信息放到您的 POM 文件中,这样依赖您也会获得 PowerMock 和他所依赖的第三方包。
<properties> <powermock.version>1.5.6</powermock.version> </properties> <dependencies> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency> </dependencies>
1.4、如何安装 PowerMock
在 1.3 中已经很清楚的讲述了如何获得 PowerMock 的安装包,相信如何安装是非常简单的事情,加载到对应的 classpath 中即可,不再赘述了。
二、PowerMock 入门
2.1、使用场景
在现实的软件开发过程中,我们经常需要协同其他同事一起来完成某个模块的功能开发,或者需要第三方资源,比如您需要一个短信网关,您需要一个数据库,您需要一个消息中间件,当您进行测试依赖于这些资源的代码时候,不可能在每次都具备相应的环境,这将
是一个很不现实的问题,如果当您依赖于其他模块而无法进行单元测试的时候,此时该模块的质量风险就有两个,第一是您所负责的代码,第二是您所依赖的代码,您所依赖您没有办法在很快的时间协调到资源,那么您所负责的代码由于不具备单元测试环境没有办法进行测试,很可能存在极大的风险,因此如何测试您的代码,让他的质量达到百分之百的可用,这就是 Mock 存在的必要,如果您还不能清楚这个场景,我们举一个大家都耳熟能详的例子来探讨一下。
采用三层架构的方式实现某个 WEB 的请求到业务受理,已经变得非常成熟,甚至现在在更多的分层,更多的细化每一个层次的职责,尽量使某一个层次可以最大化的重用,减少耦合,下图您应该非常熟悉了吧。
那么请大家思考如下几个问题:
1、如何保证各个层次模块的代码完全可用,在正常和临界情况下?
2、您使用集成测试做单元测试么?
很多人所谓的测试恐怕更多的是一种集成测试,也就是点击页面某个按钮看看是否能够顺利执行,所依赖的各种资源都必须正常运行,如果出现问题就很难让整个流程执行下去,如上图所示,我们如何在没有数据库的时候能够测试我们的 Service,没有 Payment Gate的时候进行支付的测试等等,这才是 Mock 要解决的问题,请注意是 Mock 而不是PowerMock(PowerMock 也是一种 Mock,但是他主要是解决其他 Mock 不能解决的问题)。
2.2、PowerMock 之 HelloWorld
如果您已经理解了 2.1 中所表达的观点,那么我们就开始一个简单的例子,让大家先对PowerMock 有一个比较具象的认识,然后我们在接下来的文章将一一演示如何使用强大的PowerMock,在这个世界上程序员是最最热爱世界的一类人群,因为他们在学习任何一门语言,学习任何一个框架,都要问候世界好多次。
2.2.1、获取所有员工的个数
我们现在有一个 Service 类,就是 EmployeeService,其中有一个方法需要获取数据库中雇员的数量,Service 代码如下所示:
package com.wangwenjun.powermock.helloworld.service; import com.wangwenjun.powermock.helloworld.dao.EmployeeDao; public class EmployeeService { private EmployeeDao employeeDao; public EmployeeService(EmployeeDao employeeDao) { this.employeeDao = employeeDao; } /** * 获取所有员工的数量. * @return */ public int getTotalEmployee() { return employeeDao.getTotal(); } }
可以看到,创建 Service 的时候需要传递一个 EmployeeDao 这个类,也就是说 Service依赖于 Persistence,如果想要测试 Service 就需要完全看 Persistence 的脸色,我们再来看看 Persistence 代码,如下所示
package com.wangwenjun.powermock.helloworld.dao; public class EmployeeDao { public int getTotal() { throw new UnsupportedOperationException(); } }
哇!你死定了,你肯定调用不了 Dao,无法正常完成 Service 的测试,我为什么要在Persistence的方法抛出UnsupportedOperationException呢?目的就是告诉大家该方法可能由于某种原因(没有完成,或者资源不存在等)无法为 Service 服务,难道你不需要测试 EmployeeService 么?肯定要测试,那么我们就硬着头皮来写测试用例吧。测试代码如下所示
package com.wangwenjun.powermock.helloworld.service; import static org.junit.Assert.assertEquals; import org.junit.Test; import com.wangwenjun.powermock.helloworld.dao.EmployeeDao; public class EmployeeServiceTest { @Test public void testGetTotalEmployee() { final EmployeeDao employeeDao = new EmployeeDao(); final EmployeeService service = new EmployeeService(employeeDao); int total = service.getTotalEmployee(); assertEquals(10, total); } }
【下载地址】
百度网盘链接:https://pan.baidu.com/s/1nS1Mhi7inFnhIIQ0VG4ZbQ
提取码:jx4s
相关文章
使用-JFreeChart来创建基于web的图表
XStream使用文档
WebService发布过程及常见问题
webpack实战入门进阶调优分享
weblogic调优参数及监控指标
weblogic节点管理
weblogic管理控制台概述
weblogic-部署和启动
WebLogic-Server-性能及调优-调优-Java-虚拟机
Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 Weblogic Server 和应用程序的性能。
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。
Velocity 用户手册是帮助页面设计者和内容提供者认识 Velocity 和其简单而功能强大的脚本语言――Velocity 模板语言(VTL)。在手册上的许多例子,都是用 Velocity 插入动态的内容到网页上,但是所有的 VLT 例子都能应用到其他的页面和模板中。
FlashFXP绿色版网盘下载,附激活教程 1738
FlashFxp百度网盘下载链接:https://pan.baidu.com/s/1MBQ5gkZY1TCFY8A7fnZCfQ。FlashFxp是功能强大的FTP工具
Adobe Fireworks CS6 Ansifa绿色精简版网盘下载 1540
firework可以制作精美或是可以闪瞎眼的gif,这在广告领域是需要常用的,还有firework制作下logo,一些原创的图片还是很便捷的,而且fireworks用法简单,配合dw在做网站这一块往往会发挥出很强大的效果。百度网盘下载链接:https://pan.baidu.com/s/1fzIZszfy8VX6VzQBM_bdZQ
navicat for mysql中文绿色版网盘下载 1605
Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq
火车头采集器(旗舰版)绿色版网盘下载 1691
火车头采集器是站长常用的工具,相比于八爪鱼,简洁好用,易于配置。火车头能够轻松的抓取网页内容,并通过自带的工具对内容进行处理。站长圈想要做网站,火车头采集器是必不可少的。百度网盘链接:https://pan.baidu.com/s/1u8wUqS901HgOmucMBBOvEA
Photoshop(CS-2015-2023)绿色中文版软件下载 1805
安装文件清单(共46G)包含Window和Mac OS各个版本的安装包,从cs到cc,从绿色版到破解版,从安装文件激活工具,应有尽有,一次性打包。 Photoshop CC绿色精简版 Photoshop CS6 Mac版 Photoshop CC 2015 32位 Photoshop CC 2015 64位 Photoshop CC 2015 MAC版 Photoshop CC 2017 64位 Adobe Photoshop CC 2018 Adobe_Photoshop_CC_2018 Photoshop CC 2018 Win32 Photoshop CC 2018 Win64