EasyMock总览

下面,我将讲述如何使用JUnit和EasyMock框架来进行单元测试。

在现实情况下,我们通常是在一些类里使用另外的一些类。在进行真正的测试之前,你可能需要做很多的工作,比喻说安置大量的环境代码,启动一种大型的、复杂的系统,可能是数据库、功过刘或者是某一种类型的IDE环境,你的预设环境代码需要是系统进入某种特定的状态,以便按照测试所需要的方法进行响应。但是这种工作不大可能很快就能完成。

为了对一部分类进行单元测试,你需要建立和控制另外一些类。最好的办法就是为需要测试的类创建一个模拟对象。你可以自己手工的编写类,也可以使用EasyMock来产生这些对象。

模拟对象提供了一种经过证明是成功的解决方案。当我们很难或不可能为某种难以处理的资源创建需要的状态或者存取某种资源受限时,你就可以使用模拟对象。

模拟对象取代真实对象的位置,用于测试一些与真实对象进行交互或依赖于真实对象的功能。模拟对象背后的基本思想就是创建轻量级的、可控制的对象来代替为了编写测试为需要使用的对象。模拟对象还能够让你指定和测试你的代码与模拟对象本身之间的交互。

说的再直白一点,一个模拟对象就是一个简单的接口或者是类,在里面你可以定义一个特定的方法调用之后的简单的输出。

所需jar包

EasyMock的使用,需要两个jar包,Junit和EasyMock的jar包,

你可以自己从官网上分别下载它们,也可以从下面的地址下载:

Junit4.11:http://download.csdn.net/detail/zyh5540/5860807

EasyMock3.2:http://download.csdn.net/detail/zyh5540/5860785

其中使用Junit时可能提示缺少hamcrest的jar包,这时你需要导入该jar包,同时你可以去Junit的官网下载hamcrest的jar包,此时需要主义Junit和harmcrest之间的版本号对应关系,这个也可以从官网上查得到。如果是从我上边提供的链接下载的,不需要单独在下载了。

示例

package easymock.income;
/**
* Position类表示职位信息,总共有三类:老板,程序猿,管理员
*/
public enum Position {
BOSS,PROGRAMMER,MANAGER
}
package easymock.income.method;

import easymock.income.Position;

/**
* 定义的计算工资的接口
* 并有一个抽象方法:计算工资
*/
public interface ICalMethod {
public abstract double cal(Position position);
}
package easymock.income;
import easymock.income.Position;
import easymock.income.exception.CalMethodException;
import easymock.income.exception.PositionException;
import easymock.income.method.ICalMethod; /**
* 收入(工资)计算的实现类,该类根据计算方法和职员的职位
* 计算该职员的工资
*/
public class IncomeCaculator {
private ICalMethod method;
private Position position; public void setMethod(ICalMethod method) {
this.method = method;
}
public void setPosition(Position position) {
this.position = position;
} public double cal() {
//计算的方法类为空,抛计算方法空异常
if(null == method){
throw new CalMethodException("cal method is null");
}
//当职位为空时,抛职位为空异常
if(null == position) {
throw new PositionException("position is null");
}
//返回该职员的工资
return method.cal(position);
} }
package easymock.income;

import easymock.income.exception.CalMethodException;
import easymock.income.exception.PositionException;
import easymock.income.method.ICalMethod; /**
* 收入(工资)计算的实现类,该类根据计算方法和职员的职位
* 计算该职员的工资
*/
public class IncomeCaculator {
private ICalMethod method;
private Position position; public void setMethod(ICalMethod method) {
this.method = method;
}
public void setPosition(Position position) {
this.position = position;
} public double cal() {
//计算的方法类为空,抛计算方法空异常
if(null == method){
throw new CalMethodException("cal method is null");
}
//当职位为空时,抛职位为空异常
if(null == position) {
throw new PositionException("position is null");
}
//返回该职员的工资
return method.cal(position);
} }

以下是方法为空的异常类和职位为空的异常类:

package easymock.income.exception;

public class CalMethodException extends RuntimeException {

	private static final long serialVersionUID = 1L;

	public CalMethodException(String message) {
super(message);
}
}
package easymock.income.exception;

public class PositionException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public PositionException(String message) {
        super(message);
    }
}
package easymock;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail; import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test; import easymock.income.IncomeCaculator;
import easymock.income.Position;
import easymock.income.exception.CalMethodException;
import easymock.income.exception.PositionException;
import easymock.income.method.ICalMethod; /**
* EasyMock的使用步骤:
* 使用 EasyMock 生成 Mock 对象
* 设定 Mock 对象的预期行为和输出;
* 将 Mock 对象切换到 Replay 状态;
* 调用 Mock对象方法进行单元测试; 对 Mock 对象的行为进行验证。
*
*/
public class EasyMockTest { private ICalMethod calMethod;
private IncomeCaculator caculator; @Before
public void setUpBeforeClass() throws Exception {
//第一步:生成Mock对象
calMethod = EasyMock.createMock(ICalMethod.class);
caculator = new IncomeCaculator();
} @Test
public void testCacl1() {
/**
* 设定 Mock 对象的预期行为和输出
*/
//计算方法的参数是Position.BOSS,
//andReturn(),期望calMethod方法返回的是7000.0
//times(),该方法执行次数为两次
EasyMock.expect(calMethod.cal(Position.BOSS)).andReturn(7000.0)
.times(2);
//默认执行次数为一次
EasyMock.expect(calMethod.cal(Position.PROGRAMMER)).andReturn(5000.0); //将 Mock 对象切换到 Replay 状态
EasyMock.replay(calMethod); /**
* 调用 Mock 对象方法进行单元测试
* 代码的参数设置及返回结果应参考上面预期行为的设定
* 方法的执行顺序应和上面的一致
*/
caculator.setMethod(calMethod);
try {
caculator.cal();
fail("exception is not occur");
} catch (PositionException e) {
System.out.println("position exception");
}
caculator.setPosition(Position.BOSS);
//判断结果是否和预期的一样
//第一次预期的执行
//这里应该让caculator.cal()方法执行两次,这个次数和上面设定的次数一致
assertEquals(caculator.cal(), 7000.0, 0);
assertEquals(caculator.cal(), 7000.0, 0); //第二次预期的执行
caculator.setPosition(Position.PROGRAMMER);
assertEquals(5000.0, caculator.cal(), 0); caculator.setPosition(Position.MANAGER); //对 Mock对象的行为进行验证,验证是否两次预期都已执行
EasyMock.verify(calMethod);
} //测试能否抛出计算方法为空的异常
@Test(expected = CalMethodException.class)
public void testNoCalc() {
caculator.setPosition(Position.MANAGER);
caculator.cal();
} @Test(expected = PositionException.class)
public void testNoPosition() {
EasyMock.expect(calMethod.cal(Position.BOSS)).andReturn(7000.0);
EasyMock.replay(calMethod);
caculator.setMethod(calMethod);
caculator.cal();
} @Test(expected = PositionException.class)
public void testCalc2() {
//andThrow(),预期抛出一个异常
EasyMock.expect(calMethod.cal(Position.MANAGER))
.andThrow(new PositionException("Don't know this guy"))
.times(1); EasyMock.replay(calMethod);
caculator.setPosition(Position.MANAGER);
caculator.setMethod(calMethod);
caculator.cal();
} }

[置顶] EasyMock的简单使用的更多相关文章

  1. [置顶] EasyMock构建单元测试

    1. 背景 单元测试作为程序的基本保障.很多时候构建测试场景是一件令人头疼的事.因为之前的单元测试都是内部代码引用的,环境自给自足.开发到了一定程度,你不得不到开始调用外部的接口来完成你的功能.而外部 ...

  2. PHPCMS实现文章置顶功能的方法

    我个人喜欢把PHPCMS当作博客来用,而作为一个博客,怎能少了文章置顶功能呢?其中用PHPCMS实现置顶功能非常简单,无非是修改下推荐位的名称为置顶,然后在文章列表中推送需要置顶的文章罢了. 不过博客 ...

  3. html简单响应式滚动条置顶

    简单响应式滚动条置顶 一般的,让页面出现滚动条的常见方法有: overflow:auto||overflow:scroll 或者overflow-x水平滚动条和overflow-y垂直滚动条 那么现在 ...

  4. ahk之路:利用ahk在window7下实现窗口置顶

    操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...

  5. 【搬运工】NOIP吧置顶贴

    目的是存置顶贴里的链接.. 原帖:http://tieba.baidu.com/p/1753284199 资源站:*C++资源:http://tieba.baidu.com/p/1239792581* ...

  6. [置顶]VC2013的一个bug

    [置顶]VC2013的一个bug 前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其 ...

  7. [知了堂学习笔记]_css3特效第二篇--行走的线条&&置顶导航栏

    一.行走的线条. 效果图(加载可能会慢一点儿,请稍等...): html代码: <div class="movingLines"> <img src=" ...

  8. jQuery实现表格行上移下移和置顶

    jQuery实现表格行上移下移和置顶 我们在操作列表数据的时候,需要将数据行排列顺序进行调整,如上移和下移行,将行数据置顶等,这些操作都可以在前端通过点击按钮来完成,并且伴随着简单的动态效果,轻松实现 ...

  9. 解析Delphi 窗口置顶,及非主窗口置顶

    方法一: procedure TForm1.Button2Click(Sender: TObject);begin Form2.Show; Application.NormalizeTopMosts; ...

随机推荐

  1. vs2010公布时去除msvcp100.dll和msvcr100.dll图讲解明

    近期开发个程序,Copy到虚拟机环境中測试时提示缺少msvcr100.dll,于是想到编译时设置选项去除依赖. 什么是 msvcr100.dll MS = Microsoft V = Visual C ...

  2. SharePoint 2013 配置开发环境,需安装VS2012插件

    原文:SharePoint 2013 配置开发环境,需安装VS2012插件 SharePoint 2013已经安装好了,接下来就是配置开发环境,安装VS2012,但是,装好了以后,发现没有ShareP ...

  3. Web在线视频方案浅谈

    写在前面 最近因为项目预研,花时间和精力了解并总结了现如今web在线视频的一些解决方案,由于资历薄浅,措辞或是表述难免出现遗漏,还望各位海涵,有好的建议或方案还望赐教,定细心学习品位. 如今的web技 ...

  4. CentOS安装KVM步骤虚拟机,绝对实用!

    KVM(Kernel-based Virtual Machine)速记.这是rhel5.4最新的虚拟化技术启动,现在只支持红帽64位rhel5.4在执行KVM,硬件必须支持同一时间VT技术,网上找 ...

  5. word插入图片显示不完整的解决的方法

    有时在编写word文档,插入图片时,会出现图不完整的情况. 解决方法是:选中图片,段落格式设置为单位行距(不是22磅),图片格式为嵌入式.问题解决.

  6. 如何解决KEIL 5 编KEIL4同RTX系统的project解

    1.我个人KEIL5与KEIL4对照 相较于KEIL 5 的"华丽".笔者还是喜欢KEIL4的"内敛",主要也还是习惯了.懒得换了.由于工作的  原      ...

  7. jvm对大对象分配内存的特殊处理(转)

    前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事 ...

  8. SSIS从理论到实战,再到应用(7)----常用的数据类型转换操作

    原文:SSIS从理论到实战,再到应用(7)----常用的数据类型转换操作 上期回顾: SSIS从理论到实战,再到应用(6)----SSIS的自带日志功能 在抽取各种应用的数据时候,经常会遇到数据需要转 ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据 ...

  10. 接收终端Request.InputStream阅读

    接收终端Request.InputStream阅读请求页面参数,最后字符串. byte[] byts = new byte[HttpContext.Current.Request.InputStrea ...