JUnit4学习(四)使用EasyMock进行测试
1.EasyMock总览:
接下来,让我告诉大家如何使用JUnit和EasyMock框架来进行单元测试。
我们的第一个例子非常简单,但是在现实情况下,你通常是在一些类里使用另外的一些类。在进行真正的测试之前,你可能需要做很多的工作,比喻说安置大量的环境代码,启动一种大型的、复杂的系统,可能是数据库、功过刘或者是某一种类型的IDE环境,你的预设环境代码需要是系统进入某种特定的状态,以便按照测试所需要的方法进行响应。但是这种工作不大可能很快就能完成。
为了对一部分类进行单元测试,你需要建立和控制另外一些类。最好的办法就是为需要测试的类创建一个模拟对象。你可以自己手工的编写类,也可以使用EasyMock来产生这些对象。
模拟对象提供了一种经过证明是成功的解决方案。当我们很难或不可能为某种难以处理的资源创建需要的状态或者存取某种资源受限时,你就可以使用模拟对象。
模拟对象取代真实对象的位置,用于测试一些与真实对象进行交互或依赖于真实对象的功能。模拟对象背后的基本思想就是创建轻量级的、可控制的对象来代替为了编写测试为需要使用的对象。模拟对象还能够让你指定和测试你的代码与模拟对象本身之间的交互。
说的再直白一点,一个模拟对象就是一个简单的接口或者是类,在里面你可以定义一个特定的方法调用之后的简单的输出。
2.被测试的方法:
public class IncomeCalc { private ICalcMethod method; private Position position; public void setMethod(ICalcMethod method) { this.method = method; } public void setPosition(Position position) { this.position = position; } public double calc(){ return method.calc(position); } }
接口:
public interface ICalcMethod { public abstract double calc(Position position); }
枚举类:
public enum Position {
BOSS,PROGRAMMER,MANAGER
}
3.使用JUnit和EasyMock进行测试:
import static org.junit.Assert.*; import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; public class IncomeCalcTest { private ICalcMethod mock; private IncomeCalc incomeCalc; @Before public void setUp() throws Exception { //一、建立模拟对象 mock=EasyMock.createMock(ICalcMethod.class); incomeCalc=new IncomeCalc(); } /** * expect方法告知EasyMock希望得到一个特定的方法,使用一些特定的参数, * addReturn为某一个方法定义返回值。times方法定义了模拟对象将被调用几次。 * reply方法需要在让模拟对象可用之前被调用。 * 执行完测试之后,你可以调用verify方法来检查模拟对象是不是跟预期的一样被调用了。 */ @Test public void testCalc() { //二、准备工作:记录:记录测试中所用到得方法、返回值和执行次数。 EasyMock.expect(mock.calc(Position.BOSS)).andReturn(7000.00).times(2); EasyMock.expect(mock.calc(Position.MANAGER)).andReturn(5000.00); //三、准备完后:设置mock对象为“回放”模式 EasyMock.replay(mock); //四、进行测试 incomeCalc.setMethod(mock); incomeCalc.setPosition(Position.BOSS); assertEquals(7000.00, incomeCalc.calc());//因为预定测试2遍 assertEquals(7000.00, incomeCalc.calc());//否则会出错 incomeCalc.setPosition(Position.MANAGER); assertEquals(5000.00, incomeCalc.calc()); //incomeCalc.setPosition(Position.PROGRAMMER); //五、判断这个模拟对象中的所有的方法是否已经都执行了。 // 不是必需的步骤 EasyMock.verify(mock); } }