欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

EasyMock jUnit单元测试教程,easymockjunit,这个教程介绍如何使用Ea

来源: javaer 分享于  点击 22358 次 点评:272

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是否正常工作了。

相关栏目:

用户点评