话不多说,先上代码,测试一个根据岗位计算工资的类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的人士提供样例模板,同样地,也给有需求搭建小程序版的实时在线多人游戏项目的朋友,提供一个切实可运行的项目模板,助你在开发的...
虽然您当然不需要使用此存储库来学习本书,但我认为最好为读者节省一些初步的打字工作,而将时间和精力花在专注于材料上。 作为一个Git仓库,您需要至少具备基本的Git技能才能充分利用这些示例。 如果您不熟悉Git,...
我也专门建立了读者交流群,想加群的读者可以加我微信easy_coder 在线阅读站点1: : 在线阅读站点2: : 备份站点: : 可以在【高级服务器开发】微信公众号后台回复关键字“站点下载”即可获得下载链接。 第一...
通过阅读redux(version 3.6.0)和redux-thunk(version 2.0.0)的源码,...通过学习这个repository,假设你已经对redux有初步的使用经验和对FP(函数式编程)已经有一定的了解,那么你可以在1个小时内,对redux有更深层次的
小程序是一个易上手的东西, 对于新手来说,多看官方文档,可以初步做出比较完整的小程序,正是因为简单上手,功能实现简单,小程序是越来越火,商业价值也越来越大。 1. 微信web开发者工具:微信小程序官网 这是个...
重新申请leetcode账号开始有记录地刷题,初步计划一天3道题 看题目 -> 自己想解题思路 -> 提交至通过 -> 保存用时最短的代码 -> 学习官方solution -> 学习讨论区 -> Google查找新解题思路 -> 学习用时最短的代码 -> ...
请看看吧,看过之后,希望你再谈起音频编辑、audition,可以感觉到“o~easy!” 感谢大家的关注与厚爱,谢谢 弘毅同志持续的帮助,感谢电驴提供空间。 请千万别忘了多提意见啊,oeasy教程刚刚开始做,说实话我很迷茫...
1.基于上一个版本已经完成初步的搭建,也是在工作中项目实际完成的结果,本次提供基本搭好的框架,能给予初学者一定的学习和借鉴。 2.系统包括: 1. 后台vue-api实现基本接口 2. vue后台框架 2.1 vuex、路由、...
非常完整开源的一个项目,可以作为课程设计去学习。 本系统的完整源码在文章结尾处,大家自行获取即可。 项目初览 仿造盒马鲜生,实现了部分功能。 盒马鲜生是阿里巴巴对线下超市完全重构的新零售业态,热度十分...
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, ...
以后每次先运行“Start SAP ABAP Engine”,然后再运行“ , MIN SAP Easy Access.sap” 四,ABAP/4编程 A),创建程序时程序以Z、Y、SAPMY、SAPMZ开头,并遵守以下规则,否则提示无法创建程序; 创建程序名称...
作者:徐日概述(说明应用产生的背景、实现功能)制作一...我们一个人的力量也许很渺小,但是通过不断地学习我们就会逐渐变强,同时,大家集思广益,能够共同做出一些惊艳世人的作品。我觉得这是作为一名工程师的骄傲。