`

easy初步学习

阅读更多
话不多说,先上代码,测试一个根据岗位计算工资的类IncomeCalculator
public enum Position {
    BOSS, PROGRAMMER, SURFER
} 

public interface ICalcMethod {
    double calc(Position position);
} 

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);
    }
} 


public class IncomeCalculatorTest {

  private ICalcMethod calcMethod;
  private IncomeCalculator calc;

  @Before
  public void setUp() throws Exception {
    // NiceMocks return default values for
    // unimplemented methods
    calcMethod = createNiceMock(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() {
    // Setting up the expected value of the method call calc
    expect(calcMethod.calc(Position.SURFER)).andThrow(new RuntimeException("Don't know this guy")).times(1);

    // Setup is finished need to activate the mock
    replay(calcMethod);
    calc.setPosition(Position.SURFER);
    calc.setCalcMethod(calcMethod);
    calc.calc();
  }

} 



软件不是以孤立的方式完成工作,而是大部分单元相互协作完成的。但在单元测试中我们希望忽略协作单元的使用细节,以达到独立完成测试工作的目的。Mock对象能帮助我们在测试环境下代替协作伙伴。而EasyMock为类和接口使用Mock对象提供了一种简单的方式。

对一个类(而非接口)生成mock对象,需要额外jar包Objenesis和Cglib(见附件);
如果是一个相对复杂的测试用例,需要对多个接口生成mock对象,使用MockControl来管理。

关于easymock更详尽的描述和使用技巧,请参考:
http://www.ibm.com/developerworks/cn/java/j-easymock.html
分享到:
评论

相关推荐

    基于小程序的多人联机五指棋游戏完整源码

    仅需下载源码,然后配置好appId即可上线运行,为初步学习uniapp或者学习使用go-easy的人士提供样例模板,同样地,也给有需求搭建小程序版的实时在线多人游戏项目的朋友,提供一个切实可运行的项目模板,助你在开发的...

    easy_react_starter:Easy React入门骨架

    虽然您当然不需要使用此存储库来学习本书,但我认为最好为读者节省一些初步的打字工作,而将时间和精力花在专注于材料上。 作为一个Git仓库,您需要至少具备基本的Git技能才能充分利用这些示例。 如果您不熟悉Git,...

    CppGuide:CC ++学习,初步开发进阶指南

    我也专门建立了读者交流群,想加群的读者可以加我微信easy_coder 在线阅读站点1: : 在线阅读站点2: : 备份站点: : 可以在【高级服务器开发】微信公众号后台回复关键字“站点下载”即可获得下载链接。 第一...

    easy-way-to-learn-redux:在这里,您可以比阅读其他文档更快地学习redux。

    通过阅读redux(version 3.6.0)和redux-thunk(version 2.0.0)的源码,...通过学习这个repository,假设你已经对redux有初步的使用经验和对FP(函数式编程)已经有一定的了解,那么你可以在1个小时内,对redux有更深层次的

    基于微信小程序实现影视推荐、音乐播放、地图【学习Demo】小程序源码分享

    小程序是一个易上手的东西, 对于新手来说,多看官方文档,可以初步做出比较完整的小程序,正是因为简单上手,功能实现简单,小程序是越来越火,商业价值也越来越大。 1. 微信web开发者工具:微信小程序官网 这是个...

    leetcode2sumc-leetcode:leetcode

    重新申请leetcode账号开始有记录地刷题,初步计划一天3道题 看题目 -> 自己想解题思路 -> 提交至通过 -> 保存用时最短的代码 -> 学习官方solution -> 学习讨论区 -> Google查找新解题思路 -> 学习用时最短的代码 -> ...

    au15多轨初步-oeasy,audition,多轨模式,多轨编辑,Mixer.rm

    请看看吧,看过之后,希望你再谈起音频编辑、audition,可以感觉到“o~easy!” 感谢大家的关注与厚爱,谢谢 弘毅同志持续的帮助,感谢电驴提供空间。 请千万别忘了多提意见啊,oeasy教程刚刚开始做,说实话我很迷茫...

    Thinkphp5+element+vue开发的后台管理系统

    1.基于上一个版本已经完成初步的搭建,也是在工作中项目实际完成的结果,本次提供基本搭好的框架,能给予初学者一定的学习和借鉴。 2.系统包括: 1. 后台vue-api实现基本接口 2. vue后台框架 2.1 vuex、路由、...

    java盒马鲜生小程序源码.rar

    非常完整开源的一个项目,可以作为课程设计去学习。 本系统的完整源码在文章结尾处,大家自行获取即可。 项目初览 仿造盒马鲜生,实现了部分功能。 盒马鲜生是阿里巴巴对线下超市完全重构的新零售业态,热度十分...

    图书管理信息系统 SIM SQL Server2000数据库管理系统

    For applications which require full-featured and easy to use and so on. Therefore, I combined into the Library's request for SQL Server2000 database management system, SQL language principle, ...

    ABAP开发环境的安装

    以后每次先运行“Start SAP ABAP Engine”,然后再运行“ , MIN SAP Easy Access.sap” 四,ABAP/4编程 A),创建程序时程序以Z、Y、SAPMY、SAPMZ开头,并遵守以下规则,否则提示无法创建程序; 创建程序名称...

    【RT-Thread作品秀】远程遥控救险机器人-电路方案

    作者:徐日概述(说明应用产生的背景、实现功能)制作一...我们一个人的力量也许很渺小,但是通过不断地学习我们就会逐渐变强,同时,大家集思广益,能够共同做出一些惊艳世人的作品。我觉得这是作为一名工程师的骄傲。

Global site tag (gtag.js) - Google Analytics