[置顶] EasyMock构建单元测试
1. 背景
单元测试作为程序的基本保障。很多时候构建测试场景是一件令人头疼的事。因为之前的单元测试都是内部代码引用的,环境自给自足。开发到了一定程度,你不得不到开始调用外部的接口来完成你的功能。而外部条件是不稳定的。你为了模拟外部环境要创建各种文件、各种数据。严重影响到单元测试的效率。EasyMock应运而生,他提供了模拟的接口和类。不用费神去构建各种烦人的环境,就能开展有效的测试。
2. 准备环境
Easymock 3.2 + JUnit 4.11
3. 构建测试
a) 实际场景
i. 你负责开发一个会计师的功能。但计算个人所得税的接口由外部提供(鬼知道项目经理是怎么想的)。
ii. 你的代码已经开发完成了。负责开发个人所得税的接口的同事老婆生了四胞胎,天天请假带孩子。接口没写完。
iii. 你要完成你的代码并提交测试用例。前提你个懒鬼,半点额外工作都不想做。同事老婆生孩子又不能去催。然后你在网上找到了EasyMock.......
b) 测试代码
i. 个人所得税的接口
/**
* Copyright © 2008-2013, WheatMark, All Rights Reserved
*/
package com.fitweber.wheat.interfaces; /**
* 计算个人所得税
* @author wheatmark hajima11@163.com
* @Blog http://blog.csdn.net/super2007
* @version 1.00.00
* @project wheatMock
* @file com.fitweber.wheat.interfaces.IPersonalIncomeTax.java
* @bulidDate 2013-9-1
* @modifyDate 2013-9-1
* <pre>
* 修改记录
* 修改后版本: 修改人: 修改日期: 修改内容:
* </pre>
*/
public interface IPersonalIncomeTax {
/**
* 计算个人所得税,国内,2013年7级税率
* @param income
* @param deductedBeforeTax
* @return
*/
public double calculate(double income,double deductedBeforeTax); }
ii. 会计师类中计算工资方法
/**
* Copyright © 2008-2013, WheatMark, All Rights Reserved
*/
package com.fitweber.wheat; import com.fitweber.wheat.interfaces.IPersonalIncomeTax; /**
* 会计师类
* @author wheatmark hajima11@163.com
* @Blog http://blog.csdn.net/super2007
* @version 1.00.00
* @project wheatMock
* @file com.fitweber.wheat.Accountant.java
* @bulidDate 2013-9-1
* @modifyDate 2013-9-1
* <pre>
* 修改记录
* 修改后版本: 修改人: 修改日期: 修改内容:
* </pre>
*/
public class Accountant { private IPersonalIncomeTax personalIncomeTax; public Accountant(){ } public double calculateSalary(double income){
//税前扣除,五险一金中个人扣除的项目。8%的养老保险,2%的医疗保险,1%的失业保险,8%的住房公积金
double deductedBeforeTax = income*(0.08+0.02+0.01+0.08);
return income - deductedBeforeTax - personalIncomeTax.calculate(income,deductedBeforeTax);
} /**
* @return the personalIncomeTax
*/
public IPersonalIncomeTax getPersonalIncomeTax() {
return personalIncomeTax;
} /**
* @param personalIncomeTax the personalIncomeTax to set
*/
public void setPersonalIncomeTax(IPersonalIncomeTax personalIncomeTax) {
this.personalIncomeTax = personalIncomeTax;
} }
iii. 测试会计师类中计算工资方法
或许你不知道个人所得税的计算方式。但是你可以去百度一下。对,百度上有个人所得税计算器。和2011年出台的个人所得税阶梯税率。
通过百度的帮忙(更多的时候你要求助于业务组的同事)你可以确认如果你同事的个人所得税的计算接口正确的话,传入国内实际收入8000.00,税前扣除1520.00。应该返回193.00的扣税额。然后我们可以设置我们的Mock对象的行为来模仿接口的传入和返回。用断言来确认会计师的计算工资的逻辑。完成了我们的测试用例。
/**
* Copyright © 2008-2013, WheatMark, All Rights Reserved
*/
package com.fitweber.wheat.test; import static org.easymock.EasyMock.*;
import junit.framework.Assert; import org.easymock.IMocksControl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import com.fitweber.wheat.Accountant;
import com.fitweber.wheat.interfaces.IPersonalIncomeTax; /**
* 会计师测试类
* @author wheatmark hajima11@163.com
* @Blog http://blog.csdn.net/super2007
* @version 1.00.00
* @project wheatMock
* @file com.fitweber.wheat.test.AccountantTest.java
* @bulidDate 2013-9-1
* @modifyDate 2013-9-1
* <pre>
* 修改记录
* 修改后版本: 修改人: 修改日期: 修改内容:
* </pre>
*/
public class AccountantTest { private IPersonalIncomeTax personalIncomeTax;
private Accountant accountant; /**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
IMocksControl control = createControl();
personalIncomeTax = control.createMock(IPersonalIncomeTax.class);
accountant = new Accountant();
accountant.setPersonalIncomeTax(personalIncomeTax);
} /**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
System.out.println("----------AccountantTest中的全部用例测试完毕---------");
} @Test
public void testCalculateSalary(){
//个人所得税的计算接口还没实现,但会计师的计算工资的方法已经写好了。需要测试。
//我们可以先Mock一个出来测试。
//个人所得税的计算接口正确的话,传入实际收入8000.00,税前扣除1520.00。应该返回193.00.
expect(personalIncomeTax.calculate(8000.00,1520.00)).andReturn(193.00);
//设置到回放状态
replay(personalIncomeTax);
//验证计算工资方法计算是否正确。
Assert.assertEquals(8000.00-1520.00-193.00, accountant.calculateSalary(8000.00));
verify(personalIncomeTax);
} }
4. 执行测试
最后是最简单的一步了。右键点击AccountantTest.java,Run As —> JUnit Test。得到下面的成功界面。
PS:到上面一步,单元测试已经是完成了。拥有好奇心的你还可以testCalculateSalary()方法里的数值去看看如果单元测试不通过会报什么错。
比如,改一下所传的参数personalIncomeTax.calculate(8000.00,1520.00)变为personalIncomeTax.calculate(9000.00,1520.00)。
改一下断言什么的,报错又会是什么。Assert.assertEquals(8000.00-1520.00-193.00, accountant.calculateSalary(8000.00));
具体的EasyMock文档在网络上已经漫天飞。自己去找找,深入了解下EasyMock。
[置顶] EasyMock构建单元测试的更多相关文章
- [置顶] EasyMock的简单使用
		
EasyMock总览 下面,我将讲述如何使用JUnit和EasyMock框架来进行单元测试. 在现实情况下,我们通常是在一些类里使用另外的一些类.在进行真正的测试之前,你可能需要做很多的工作,比喻说安 ...
 - [置顶] C语言单元测试框架
		
unitest.h /****************************************************************************** * * * This ...
 - [置顶] 创建GitHub技术博客全攻略
		
[置顶] 创建GitHub技术博客全攻略 分类: GitHub2014-07-12 13:10 19710人阅读 评论(21) 收藏 举报 githubio技术博客网站生成 说明: 首先,你需要注册一 ...
 - 在UWP中页面滑动导航栏置顶
		
最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...
 - WinFrom窗体始终置顶
		
调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...
 - winform窗体置顶
		
winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...
 - 自定义置顶TOP按钮
		
简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...
 - ahk之路:利用ahk在window7下实现窗口置顶
		
操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...
 - Qt中让Qwidget置顶的方法
		
一般来是说窗体置顶和取消只要 setWindowFlags(Qt::WindowStaysOnTopHint); setWindowFlags(Qt::Widget); 要 ...
 
随机推荐
- 基于visual Studio2013解决C语言竞赛题之0703乾坤大挪移
			
   题目
 - Machine Learning #Lab1# Linear Regression
			
Machine Learning Lab1 打算把Andrew Ng教授的#Machine Learning#相关的6个实验一一实现了贴出来- 预计时间长度战线会拉的比較长(毕竟JOS的7级浮屠还没搞 ...
 - http异步请求
			
1.加载异步请求包文件 2.java代码 package com.example.asynchttp; import org.apache.http.Header; import com.loopj. ...
 - WCF技术剖析之十六:数据契约的等效性和版本控制
			
原文:WCF技术剖析之十六:数据契约的等效性和版本控制 数据契约是对用于交换的数据结构的描述,是数据序列化和反序列化的依据.在一个WCF应用中,客户端和服务端必须通过等效的数据契约方能进行有效的数据交 ...
 - [cocos2d-x]HelloWorldDemo
			
实现一个demo,具备以下功能: 1.让几个字分别位于中间和四个角落. 2.中间的字体改变,并且带有闪烁功能. 3.单点触摸和多点触摸,并且能够实现滑动效果,滑动的话必须使用带有bool返回值的单点触 ...
 - 基于visual Studio2013解决C语言竞赛题之1088模拟计算器
			
    题目 解决代码及点评 /************************************************************************/ /* ...
 - javascript 中对this关键字的一些理解
			
var self = this 可能会觉得奇怪为什么我会定义一个_self的变量, 因为在js里,this不用对于其他的对象语言,他的解析过程与运行过程中this会改变的.这里简单说说js里this的 ...
 - python学习——截图工具编写
			
学习一门语言最好的方法便是实践,想要拿Python写一个截图工具,网上一搜资料果然已经很多,前辈们都已经做的很到位了.现在就一步步来学习一下: 首先学习截图整个桌面的方法,可以使用Python中的PI ...
 - BootStrap - FileUpload美化样式
			
效果: 代码: <div class="panel panel-default" style="border: 1px solid #ffd800;"&g ...
 - 关于在打包Jar文件时遇到的资源路径问题(二)
			
在关于<关于在打包Jar文件时遇到的资源路径问题(一)>中,以及描述了当资源与可执行JAr分离时的资源路径代码的编写问题,后来想了想,为什么将<Java核心技术卷一>中的程序1 ...