转载:http://blog.csdn.net/u012881904/article/details/51334747

  1. 我们的依赖的配置
<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. 使用的场景 
    在现实的软件开发过程中,我们经常需要协同其他同事一起来完成某个模块的功能开发,或者需要第三方资源,比如您需要一个短信网关,您需要一个数据库,您需要一个消息中间件,当您进行测试依赖于这些资源的代码时候,不可能在每次都具备相应的环境,这将是一个很不现实的问题,如果当您依赖于其他模块而无法进行单元测试的时候,此时该模块的质量风险就有两个,第一是您所负责的代码,第二是您所依赖的代码,您所依赖您没有办法在很快的时间协调到资源, 那么您所负责的代码由于不具备单元测试环境没有办法进行测试,很可能存在极大的风险,因此如何测试您的代码,让他的质量达到百分之百的可用, 这就是 Mock 存在的必要。我们如何在没有数据库的时候能够测试我们的 Service,进行支付的测试等等,这才是 Mock 要解决的问题PowerMock(PowerMock 也是一种 Mock,但是他主要是解决其他 Mock 不能解决的问题)

在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,远程服务, 文件系统等等)。 而我们没法控制这些外部依赖的对象,为了解决这个问题,我们就需要用到Mock工具来模拟这些外部依赖的对象,来完成单元测试。

今天我在测试的时候,需要一个HttpResponse对象哦~怎么办呢?只有模拟这个对象啦!不知道可以不~~

  1. hello word 的使用!获取所有员工的个数 
    我们现在有一个 Service 类,就是 EmployeeService,其中有一个方法需要获取数据库中雇员的数量,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 代码,如下所示

public class EmployeeDao {
public int getTotal()
{
throw new UnsupportedOperationException();
}
}

哇!你死定了,你肯定调用不了 Dao,无法正常完成 Service 的测试,我为什么要在Persistence的方法抛出UnsupportedOperationException呢?目的就是告诉大家该方法可能由于某种原因(没有完成,或者资源不存在等)无法为 Service 服务,难道你不需要测试 EmployeeService 么?肯定要测试,那么我们就硬着头皮来写测试用例吧

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);
}
}

比较的遗憾,这个肯定的会失败的哦~不会成功的,我们的Dao层的数据都还没有实现怎么可能会有好的数据返回呢? 
所以啊,这个时候我们就模拟啊~,当我们的service层调用代码的时候,我们就可以使用啦!employeeDao.getTotal(); 
我们要去模拟这个方法的返回值,必须的去请求我们的返回的数据,这个时候就是模拟啦!

请大家忘记此时此刻我抛出来的异常,幻想成此时此刻数据库连接不上,问题现在很明显,数据库链接不通,我们无法测试 Service,难道真的就无计可施了么?好吧,有请我们的主角 PowerMock 闪亮登场,请看下面的测试用例

import org.junit.Test;
import org.powermock.api.mockito.PowerMockito;
import com.wangwenjun.powermock.helloworld.dao.EmployeeDao;
public class EmployeeServiceTest {
@Test
public void testGetTotalEmployeeWithMock() {
EmployeeDao employeeDao = PowerMockito.mock(EmployeeDao.class);
PowerMockito.when(employeeDao.getTotal()).thenReturn(10);//当我们调用这个方法的时候的返回值是10!这样就好了涩,我们不是就模拟出来啦数据啦~
EmployeeService service = new EmployeeService(employeeDao);
int total = service.getTotalEmployee();
assertEquals(10, total);
}
}

当你再次运行时你会发现此时此刻运行通过, 编写一下上述的代码我们先来有个简单的认识,所谓 Mock 就是创建一个假的,Mock 那个对象就会创建一个假的该对象,此时该对象是一单纯的白纸,需要你对其进行涂鸦,第二句话 when…then 语法就是您的涂鸦, 您期望调用某个方法的时候返回某个您指定的值。完全让 EmployeeDao 根据你的意愿来运行,所以想怎样测试 EmployeeService 就怎样测试。

  • 创建员工 返回值为void的测试! 
    我们再来增加另外一个需求,就是创建一个 Employee,这就意味着我们需要分别在Service 和 Dao 中增加相应的两个接口
Service 中的 CreateEmployee 方法
public void createEmployee(Employee employee)
{
employeeDao.addEmployee(employee);
} 再来看看 Dao 中的方法 addEmployee 没有返回值哦~由于某些原因呢,我们就是没得返回值啦~
public void addEmployee(Employee employee)
{
throw new UnsupportedOperationException();
}

因为此时“数据库资源不存在” ,相信大家一定很清楚这一点,但是这不是本小节中所要讲述的重点,重点在于 addEmployee 方法是一个 void类型的,也就是我们没有办法断言想要的结果是否一致,而 mock 厚的 addEmployee 方法事实上是什么都不会做的,此时我们该如何进行测试呢? 比如log记录日志…里面含有httpsession对象,我们也是可以不需要打印日志的,直接不管他啦!但是测试的时候我们不能把他直接注释掉啊!忘记了怎么办呢?这样的方式很不对!以前我测试的时候也是这么直接的处理的,实习呢之后的今天,看到了这个非常的好奇哦,还不错,学到了好东西!测试非常的有必要,比编写代码更重要。反正我写测试比编写代码的时间多!

简单思考一下我们其实只是想要知道 addEmployee 方法是否被调用过即可, 当然我们可以假设他 add 成功或者失败,这就根据您的 test case 来设定了,好了,有了这个概念之后我们来看看如何测试 void 方法,其实就是 mock 中一个很重要的概念 Verifying

@Test
public void testCreateEmployee() {
EmployeeDao employeeDao = PowerMockito.mock(EmployeeDao.class);
Employee employee = new Employee();
PowerMockito.doNothing().when(employeeDao).addEmployee(employee);//当我们使用这个方法的时候我们什么都不做哦,仅仅测试哈,是否调用了这个方法就好了!
EmployeeService service = new EmployeeService(employeeDao);
service.createEmployee(employee);
// verify the method invocation.
Mockito.verify(employeeDao).addEmployee(employee);
}

然后用 junit 运行肯定能够通过, 其中 Mockito.verify 主要用来校验被 mock 出来的对象中的某个方法是否被调用,我们的 PowerMock helloworld 也到此结束了。

PowerMockito的简单的介绍的更多相关文章

  1. JS图表组件 highcharts 简单的介绍

    把highcharts拿来做个简单的介绍,希望更多的朋友可以用到这个用来做图表的js插件. preparation Highcharts Highcharts是一个制作图表的纯Javascript类库 ...

  2. vue学习笔记(二)——简单的介绍以及安装

    学习编程需要的是 API+不断地练习^_^ Vue官网:https://cn.vuejs.org/ 菜鸟教程:http://www.runoob.com/vue2/vue-tutorial.html ...

  3. EVE-NG简单入门介绍

    此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 一.导入镜像 D ...

  4. Mybatis缓存(1)--------系统缓存及简单配置介绍

    前言 Mybatis的缓存主要有两种: 系统缓存,也就是我们一级缓存与二级缓存: 自定义的缓存,比如Redis.Enhance等,需要额外的单独配置与实现,具体日后主要学习介绍. 在这里主要记录系统缓 ...

  5. GIT 分布式版本控制系统的简单使用介绍

    GIT 分布式版本控制系统的简单使用介绍 1.GIT的概念Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 与 SVN 区别:1. GIT不仅仅是个版本控制系统,它 ...

  6. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  7. NHibernate简单使用介绍

    1.在数据库中新建表格,并插入记录,SQL如下: USE WFC_DB GO create table Students ( Id ,) not null, Name ), Age int, Scor ...

  8. MonkeyTest简单实用介绍

    什么是Monkeytest? monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动Trackball.按键灯操作来对设备上的程序进行压力测试,检测程序发 ...

  9. CCNA网络工程师学习进程(6)vlan相关协议的配置与路由器简单配置介绍

        前面已经介绍了大部分与vlan技术相关的交换机的协议的配置,更深层次的还有STP协议和以太网端口聚合技术,接着还会简单介绍一下路由器的基本应用.     (1)STP(Spanning-tre ...

随机推荐

  1. [HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]

    题面 传送门 思路 首先,如果$n$和$m$没有那么大的话,有一个非常显然的dp做法: 设$dp[i][j]$表示长度为i的字符串,最后j个可以匹配模板串前j位的情况数 那么显然,答案就是$\sum_ ...

  2. [BJOI2006][bzoj1001] 狼抓兔子 [最小割]

    题面: 传送门 思路: 其实就是一道最小割的题目...... 我的写法加了两个优化,常数比较小,所以过掉了 一个是当前弧,一个是若当前点并不能流出去,那么标记dep为-1 听说正解是对偶图最短路?可以 ...

  3. Idea下maven的配置和使用

    maven的主要功能就是依赖管理,jar包仓库.和C#中的NuGet仓库差不多.另外也提供打包构建,启动插件等功能.下面主要讲一下,在使用Idea开发时,maven的配置和使用. maven的安装和配 ...

  4. 预编译scss以及scss和less px 转rem

    预编译scss步骤: 1 搜索ruby并安装,点击 2 安装sass: 3 在hubuilder工具中设置预编译: 触发命令地址为ruby安装地址 命令参数为 %FileName% %FileBase ...

  5. 【BZOJ4476&JSOI2015】送礼物(二分,RMQ)

    ANS明显是有二分性的 二分答案,设二分值为b M(i,j)−m(i,j)j−i+k>b 显然当l<长度<r时,一端是最小值,一端是最大值. 等于l或r的时候因为可能不满足以上性质, ...

  6. 8个学习.net的博客链接 (以前收藏过更多的,被百度新版搞没了,恨死了)

    原文发布时间为:2012-09-18 -- 来源于本人的百度文章 [由搬家工具导入] Simone Chiaretta’s CodeClimber http://www.haacked.com/ (  ...

  7. .NET返回上一页

    原文发布时间为:2010-05-25 -- 来源于本人的百度文章 [由搬家工具导入] if (Request.UrlReferrer != null)                {         ...

  8. js4:with,for in语句,windows,location对象的使用

    原文发布时间为:2008-11-08 -- 来源于本人的百度文章 [由搬家工具导入] <html> <head> <title>js</title> & ...

  9. a kind of async programming in c#, need to reference definition

    void Main() { Run d=new Run(RunHandler); IAsyncResult result= d.BeginInvoke(new AsyncCallback(CallBa ...

  10. bzoj 1228 [SDOI2009]E&D SG函数打表 找规律

    题目链接 Description 桌子上有2n 堆石子,编号为1..2n.将第2k-1 堆与第2k 堆(1 ≤ k ≤ n)为同一组.第i堆的石子个数用一个正整数Si表示.一次分割操作指的是,从桌子上 ...