EasyMock jUnit单元测试教程,easymockjunit,这个教程介绍如何使用Ea
EasyMock jUnit单元测试教程,easymockjunit,这个教程介绍如何使用Ea
这个教程介绍如何使用EasyMock框架做单元测试,基于EasyMock3.1.
一. 准备
学习此教程需要你理解诶如何使用jUnit框架做单元测试。
二. 使用Mock对象进行测试
单元测试是对目标类或者方法的逻辑单元进行测试。 java的类通常会依赖于其他类。 mock对象是一个接口或者类的木偶实现,您可以指定mock方法的输出和执行。
Mock对象可以保证值测试目标方法逻辑单元内的逻辑,而使测试不依赖于外部环境。
您可以手动创建要mock的对象,也可以使用mock框架来模拟这些类。使用mock框架可以在运行时创建mock并定义mock方法的行为。
mock对象的典型例子是dataProvider。 在生产环境使用真实的数据库提供数据,而在测试时使用mock对象来模拟数据库的操作。
使用Mock框架可以设置mock对象返回期望的结果,来测试目标方法的逻辑
三. java的Mock框架
现在流行的mock框架有EasyMock,jMockit和mockito
四. EasyMock 介绍
EasyMock是一个可以和jUnit很好的继承在一起的mock框架,下面描述如何使用EasyMock
EasyMock实例化的对象基于接口或者类:
// ICalcMethod 是一个要mock的对象ICalcMethod calcMethod = EasyMock.createMock(ICalcMethod.class);
EasyMock定义了几个方法来定义mock行为。 expect()
方法指定要模拟方法的方法和参数,andReturn()
方法定义方法的返回值,times()
方法定义mock对象可以调用多少次。在使用mock对象之前需要调用replay()
方法使。
// 定义mock的期望expect(calcMethod.calc(Position.BOSS)).andReturn(70000.0).times(2);expect(calcMethod.calc(Position.PROGRAMMER)).andReturn(50000.0);// 激活mock对象replay(calcMethod);
五. 下载EasyMock
可以从EasyMock的网站下载EasyMock的jar包,并引用到项目中
如果使用了maven,也可以添加如下的EasyMock的maven依赖:
<dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.1</version> <scope>test</scope> </dependency>
六. 使用jUnit + EasyMock
1) 创建项目和类
创建一个名字为cn.outofmemory.easymock.first的java项目,然后创建下面的类:
package cn.outofmemory.easymock.first;public enum Position { BOSS, PROGRAMMER, SURFER}
package cn.outofmemory.easymock.first;public interface ICalcMethod { double calc(Position position);}
package cn.outofmemory.easymock.first;public class IncomeCalculator { private ICalcMethod calcMethod; private Position position; public void setCalcMethod(ICalcMethod calcMethod) { this.calcMethod = calcMethod; } public void setPosition(Position position) { this.position = position; } public double calc() { if (calcMethod == null) { throw new RuntimeException("CalcMethod not yet maintained"); } if (position == null) { throw new RuntimeException("Position not yet maintained"); } return calcMethod.calc(position); }}
要测试的类是IncomeCalculator。 这个类用来计算指定职位和计算方法的薪水。
2)创建测试对象
在项目中添加测试的source folder,然后添加IncomeCalculator的测试类:
package cn.outofmemory.easymock.first.test;// 静态导入,这样可以直接使用expect等方法import static org.easymock.EasyMock.expect;import static org.easymock.EasyMock.replay;import static org.easymock.EasyMock.verify;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 com.vogella.testing.easymock.first.ICalcMethod;import com.vogella.testing.easymock.first.IncomeCalculator;import com.vogella.testing.easymock.first.Position;public class IncomeCalculatorTest { private ICalcMethod calcMethod; private IncomeCalculator calc; @Before public void setUp() throws Exception { calcMethod = EasyMock.createMock(ICalcMethod.class); calc = new IncomeCalculator(); } @Test public void testCalc1() { // Setting up the expected value of the method call calc expect(calcMethod.calc(Position.BOSS)).andReturn(70000.0).times(2); expect(calcMethod.calc(Position.PROGRAMMER)).andReturn(50000.0); // Setup is finished need to activate the mock replay(calcMethod); calc.setCalcMethod(calcMethod); try { calc.calc(); fail("Exception did not occur"); } catch (RuntimeException e) { } calc.setPosition(Position.BOSS); assertEquals(70000.0, calc.calc(), 0); assertEquals(70000.0, calc.calc(), 0); calc.setPosition(Position.PROGRAMMER); assertEquals(50000.0, calc.calc(), 0); calc.setPosition(Position.SURFER); verify(calcMethod); } @Test(expected = RuntimeException.class) public void testNoCalc() { calc.setPosition(Position.SURFER); calc.calc(); } @Test(expected = RuntimeException.class) public void testNoPosition() { expect(calcMethod.calc(Position.BOSS)).andReturn(70000.0); replay(calcMethod); calc.setCalcMethod(calcMethod); calc.calc(); } @Test(expected = RuntimeException.class) public void testCalc2() { // 指定calcMethod的calc方法的期望行为 expect(calcMethod.calc(Position.SURFER)). andThrow(new RuntimeException("Don't know this guy")).times(1); // 激活mock replay(calcMethod); calc.setPosition(Position.SURFER); calc.setCalcMethod(calcMethod); calc.calc(); }}
执行测试,你就可以验证mock是否正常工作了。
用户点评