话不多说,先上代码,测试一个根据岗位计算工资的类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
分享到:
相关推荐
对于开发者或管理员来说,它是理解并使用easyPay服务的重要文档,可以帮助他们快速上手并解决初步遇到的问题。 3. **关于软件双击无反应或闪退问题说明.txt**:这个文档专门针对软件运行时可能出现的技术故障,如...
3. **深度分析**:如果初步分析无法确定,DetectitEasy会进行更深层次的检查,例如分析代码结构、函数调用模式等,这有助于识别特定的编程语言和开发工具。 4. **结果展示**:最后,所有分析结果会被整理成易于理解...
通过本文,读者可以了解到自动化机器学习技术在眼部疾病识别及分类中的初步应用,了解到EasyDL平台在建立深度学习模型中的重要作用,并且可以掌握自动化机器学习技术在医疗领域的应用前景。 知识点1:自动化机器...
1. **Laravel安装与环境配置**:介绍如何在本地或服务器上设置Laravel开发环境,包括Composer的使用、虚拟主机配置、以及Artisan命令行工具的初步认识。 2. **Laravel基本结构**:解析Laravel项目的基本目录结构,...
6. **权限提升**:在获得初步访问后,提升权限到管理员是常见的目标。这可能涉及到提权漏洞的利用,或者是利用本地系统中的权限管理漏洞。 7. **文件系统与数据挖掘**:在靶机上寻找敏感文件,如SSH密钥、数据库...
《操作系统:三部曲》(Operating Systems: Three Easy Pieces,简称OSTEP)是一本深入浅出介绍操作系统原理的权威教材,由Remzi Arpaci-Dusseau和Andrea Arpaci-Dusseau两位教授撰写。V1.0版本是该书的早期版本,...
7. **实时操作系统(RTOS)的初步接触**:如果例程涉及到RTOS,例如FreeRTOS或uC/OS,那么你将学习到任务调度、信号量、互斥锁等概念,这对于构建多任务嵌入式系统至关重要。 8. **文件系统和网络编程**:如果高级...
3. **开发板硬件部分**:Easy ARM 2131开发板是基于LPC213x系列设计的,通常包括微控制器、电源管理、调试接口(如JTAG或USB)、扩展接口、示例电路等。这些硬件设施允许开发者进行功能验证、程序调试和原型设计。 ...
"基于EASY的飞机大战游戏,可以实现飞机的自动驾驶.zip" 文件为我们提供了一个独特的学习平台,它将自动驾驶算法与游戏结合,使玩家能够在游戏中直观地了解和研究自动驾驶技术。这个项目不仅易于运行部署,更是一个...
仅需下载源码,然后配置好appId即可上线运行,为初步学习uniapp或者学习使用go-easy的人士提供样例模板,同样地,也给有需求搭建小程序版的实时在线多人游戏项目的朋友,提供一个切实可运行的项目模板,助你在开发的...
虽然您当然不需要使用此存储库来学习本书,但我认为最好为读者节省一些初步的打字工作,而将时间和精力花在专注于材料上。 作为一个Git仓库,您需要至少具备基本的Git技能才能充分利用这些示例。 如果您不熟悉Git,...
使用"Easy Site Builder",企业可以快速建立一个初步的网站框架,然后通过添加和编辑文本、图片、链接等元素,塑造独特的网站风格。同时,软件提供的上下文菜单功能使得内容管理更为便捷,用户可以通过点击菜单直接...
学习和使用Easy Canvas,你需要具备基本的JavaScript知识以及对HTML5 Canvas的初步理解。通过使用Easy Canvas,你可以专注于你的应用逻辑,而无需过多关心底层的绘图细节。这有助于提高代码的可读性和可维护性,特别...
我也专门建立了读者交流群,想加群的读者可以加我微信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教程刚刚开始做,说实话我很迷茫...
通过本资料的学习,读者不仅能够掌握51单片机的基础知识和C语言编程技巧,还能初步了解单片机的硬件控制逻辑。然而,要成为真正的单片机高手,还需要不断深入学习单片机的内部结构、指令系统,以及更多高级的编程...