PowerMock单元模拟测试框架简介

一 为什么需要模拟测试单元框架

1 实际工作中会出现当对某个功能单元测试时,需要依赖其他服务,而这些服务例如第三方接口(发短信接口,支付接口),中间件(redis,消息队列,数据库等),微服务架构项目服务间相互依赖。当碰到依赖不能用或用依赖服务需要消耗大量资源时,使用模拟测试框架轻松解决,解决思路是构建服务返回结果,再执行完整的功能,断言实际结果与期望的。

2 使用单元测试框架,降低bug的出现,提前发现问题。工作中要养成这种良好的习惯。

二 常用的单元模拟测试框架Mockito、Jmock、easyMock。这次介绍能够在实际中解决更多问题的PowerMock。

三 PowerMock简介

官网简介 PowerMock 是一个框架,它扩展了其他模拟库,例如具有更强大的功能的 EasyMock。PowerMock 使用自定义类加载器和字节码操作来模拟静态方法、构造函数、最终类和方法、私有方法、静态初始化器的删除等。通过使用自定义类加载器,无需对 IDE 或持续集成服务器进行任何更改,从而简化了采用。熟悉受支持的模拟框架的开发人员会发现 PowerMock 易于使用,因为整个预期 API 是相同的,无论是静态方法还是构造函数。PowerMock 旨在使用少量方法和注释扩展现有 API,已启用额外功能。目前 PowerMock 支持 EasyMock 和 Mockito。

个人理解 PowerMock是为了解决现有的一些测试框架不能解决的问题,PowerMock可以对final修饰的类和方法,静态属性和方法,私有属性和方法进行测试。其他框架如EasyMock和Mockito目前是没有这些功能。

四 PowerMock优势

1 PowerMock 易于使用。

2 更全面地进行单元测试。

3 简单模拟一些复杂的依赖。

五 开启PowerMock入门介绍

1 下面的demo用到jar依赖如下

   <dependency>

    <groupId>org.powermock</groupId>

    <artifactId>powermock-module-junit4</artifactId>

    <version>1.7.4</version>

    <scope>test</scope>

</dependency>

<dependency>

    <groupId>org.powermock</groupId>

    <artifactId>powermock-api-mockito2</artifactId>

    <version>1.7.4</version>

    <scope>test</scope>

</dependency>

2 被测试类如下

   public class OrderDao {

    public int save(){

        throw new RuntimeException("数据连接不上了");

    }

}

public class OrderService {

    private  OrderDao orderDao;

    public OrderService(OrderDao orderDao) {

        this.orderDao = orderDao;

    }

    public int save(){

      orderDao.save();

      return 1;

  }

}

3 测试类如下。

3.1 当运行时测试是抛异常中断执行,实际工作中经常碰到。有时需要比较长时间才能恢复。那么此时用powerMock就可以快速解决,模拟数据库数据返回,请看3.2。

package powerMock;

import org.junit.Test;

public class TestOrderService {

  @Test

  public void testSave(){

      OrderDao orderDao= new OrderDao();

      OrderService  orderService=new OrderService(orderDao);

      orderService.save();

  }

}

3.2 使用powerMock构建出OrderDao实例,指定返回值,其实就是绕过数据库,构造成功执行结果, 再运行测试通过。

package powerMock;

import org.junit.Test;

import org.powermock.api.mockito.PowerMockito;

import static org.junit.Assert.assertEquals;

public class TestOrderService {

  @Test

  public void testSave(){

      OrderDao orderDao= new OrderDao();

      OrderService  orderService=new OrderService(orderDao);

      orderService.save();

  }

    @Test

    public void testSaveForPowerMock(){

        OrderDao orderDao=PowerMockito.mock(OrderDao.class);

        PowerMockito.when(orderDao.save()).thenReturn(11);

        OrderService  orderService=new OrderService(orderDao);

        int total=orderService.save();

        assertEquals(11, total);

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容