初探mock框架

 近期项目中用到了单元测试,于是研究一下:
 无论是敏捷开发、持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石。随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了。在敏捷开发、持续交付中要求单元测试一定要快(不能访问实际的文件系统或数据库),而TDD经常会碰到协同模块尚未开发的情况,而mock技术正是解决这些问题的灵丹妙药。
          mock技术的目的和作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。我们可以自己编写自定义的Mock对象实现mock技术,但是编写自定义的Mock对象需要额外的编码工作,同时也可能引入错误。现在实现mock技术的优秀开源框架有很多,本文对几个典型的mock测试框架作了简明介绍,希望对大家有所帮助。
1.EasyMock
          EasyMock 是早期比较流行的MocK测试框架。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。
EasyMock 是采用 MIT license 的一个开源项目,可以在 Sourceforge 上下载到。(http://sourceforge.net/projects/easymock/files/EasyMock/)
如果使用maven也可以如下引入:
<dependency>
     <groupId>org.easymock</groupId>
     <artifactId>easymock</artifactId>
     <version>3.1</version>
     <scope>test</scope>
</dependency>
使用EasyMock大致可以划分为以下几个步骤:
①    使用 EasyMock 生成 Mock 对象;
②    录制 Mock 对象的预期行为和输出;
③    将 Mock 对象切换到 播放 状态;
④    调用 Mock 对象方法进行单元测试;
⑤    对 Mock 对象的行为进行验证。
现在用一个例子来简单呈现以上的步骤,假设有一个需要被模拟的类如下:
public class MockOne {

    public String hello(String name){
        System.out.println("hello "+name);
        return"hello "+name;
    }

    public void show(){
        System.out.println("MockOne.show()");
    }
}
首先静态导入EasyMock的方法:
import staticorg.easymock.EasyMock.*;
public class MockOneTest {
    @Test
    public void testMockOne(){
        MockOne obj = createMock(MockOne.class);
        expect(obj.hello("lucy")).andReturn("hello liming");
        replay(obj);
        //actual实际
        String actual = obj.hello("lucy");
        assertEquals("hello liming",actual);
    }
}
2.mockito
EasyMock之后流行的mock工具。相对EasyMock学习成本低,而且具有非常简洁的API,测试代码的可读性很高。
mockito可以在https://code.google.com/p/mockito/上下载,如果使用maven可以如下引入:
<dependency>
     <groupId>org.mockito</groupId>
     <artifactId>mockito-all</artifactId>
     <version>1.9.5</version>
     <scope>test</scope>
</dependency>
使用mockito大致可以划分为以下几个步骤:
①    使用 mockito 生成 Mock 对象;
②    定义(并非录制) Mock 对象的行为和输出(expectations部分);
③    调用 Mock 对象方法进行单元测试;
④    对 Mock 对象的行为进行验证。
3.PowerMock

这个工具是在EasyMock和Mockito上扩展出来的,目的是为了解决EasyMock和Mockito不能解决的问题,比如对static, final, private方法均不能mock。
其实测试架构设计良好的代码,一般并不需要这些功能,但如果是在已有项目上增加单元测试,老代码有问题且不能改时,就不得不使用这些功能了。
PowerMock 在扩展功能时完全采用和被扩展的框架相同的 API, 熟悉 PowerMock 所支持的模拟框架的开发者会发现 PowerMock 非常容易上手。
PowerMock 的目的就是在当前已经被大家所熟悉的接口上通过添加极少的方法和注释来实现额外的功能。
目前PowerMock 仅扩展了 EasyMock 和 mockito,需要和EasyMock或Mockito配合一起使用。
PowerMock可以在https://code.google.com/p/powermock/上下载,
文以PowerMock+mockito为例,使用maven的话,添加如下依赖即可,maven会自动引入mockito的包。
<dependency>
     <groupId>org.powermock</groupId>
     <artifactId>powermock-api-mockito</artifactId>
     <version>1.5</version>
     <scope>test</scope>
</dependency>
<dependency>
     <groupId>org.powermock</groupId>
     <artifactId>powermock-module-junit4</artifactId>
     <version>1.5</version>
     <scope>test</scope>
</dependency>
4.Jmockit
JMockit 是一个轻量级的mock框架是用以帮助开发人员编写测试程序的一组工具和API,该项目完全基于 Java 5 SE 的 java.lang.instrument 包开发,
内部使用 ASM 库来修改Java的Bytecode。
Jmockit功能和PowerMock类似,某些功能甚至更为强大,但个人感觉其代码的可读性并不强。
Jmockit可以在https://code.google.com/p/jmockit/上下载,使用maven的话添加如下依赖即可:
<dependency>
     <groupId>com.googlecode.jmockit</groupId>
     <artifactId>jmockit</artifactId>
     <version>1.0</version>
     <scope>test</scope>
</dependency>
Jmockit也可以分类为非局部模拟与局部模拟,区分在于Expectations块是否有参数,有参数的是局部模拟,反之是非局部模拟。
而Expectations块一般由Expectations类和NonStrictExpectations类定义。
用Expectations类定义的,则mock对象在运行时只能按照 Expectations块中定义的顺序依次调用方法,不能多调用也不能少调用,
所以可以省略掉Verifications块;而用NonStrictExpectations类定义的,则没有这些限制,所以如果需要验证,则要添加Verifications块。





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值