EasyMock構(gòu)建單元測試
1. 背景
單元測試作為程序的基本保障。很多時候構(gòu)建測試場景是一件令人頭疼的事。因為之前的單元測試都是內(nèi)部代碼引用的,環(huán)境自給自足。開發(fā)到了一定程度,你不得不到開始調(diào)用外部的接口來完成你的功能。而外部條件是不穩(wěn)定的。你為了模擬外部環(huán)境要創(chuàng)建各種文件、各種數(shù)據(jù)。嚴(yán)重影響到單元測試的效率。EasyMock應(yīng)運(yùn)而生,他提供了模擬的接口和類。不用費(fèi)神去構(gòu)建各種煩人的環(huán)境,就能開展有效的測試。
2. 準(zhǔn)備環(huán)境
Easymock 3.2 + JUnit 4.11
3. 構(gòu)建測試
a) 實際場景
i. 你負(fù)責(zé)開發(fā)一個會計師的功能。但計算個人所得稅的接口由外部提供(鬼知道項目經(jīng)理是怎么想的)。
ii. 你的代碼已經(jīng)開發(fā)完成了。負(fù)責(zé)開發(fā)個人所得稅的接口的同事老婆生了四胞胎,天天請假帶孩子。接口沒寫完。
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> * 修改記錄 * 修改后版本: 修改人: 修改日期: 修改內(nèi)容: * </pre> */ public interface IPersonalIncomeTax { /** * 計算個人所得稅,國內(nèi),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> * 修改記錄 * 修改后版本: 修改人: 修改日期: 修改內(nèi)容: * </pre> */ public class Accountant { private IPersonalIncomeTax personalIncomeTax; public Accountant(){ } public double calculateSalary(double income){ //稅前扣除,五險一金中個人扣除的項目。8%的養(yǎng)老保險,2%的醫(yī)療保險,1%的失業(yè)保險,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年出臺的個人所得稅階梯稅率。
通過百度的幫忙(更多的時候你要求助于業(yè)務(wù)組的同事)你可以確認(rèn)如果你同事的個人所得稅的計算接口正確的話,傳入國內(nèi)實際收入8000.00,稅前扣除1520.00。應(yīng)該返回193.00的扣稅額。然后我們可以設(shè)置我們的Mock對象的行為來模仿接口的傳入和返回。用斷言來確認(rèn)會計師的計算工資的邏輯。完成了我們的測試用例。
/** * 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> * 修改記錄 * 修改后版本: 修改人: 修改日期: 修改內(nèi)容: * </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(){ //個人所得稅的計算接口還沒實現(xiàn),但會計師的計算工資的方法已經(jīng)寫好了。需要測試。 //我們可以先Mock一個出來測試。 //個人所得稅的計算接口正確的話,傳入實際收入8000.00,稅前扣除1520.00。應(yīng)該返回193.00. expect(personalIncomeTax.calculate(8000.00,1520.00)).andReturn(193.00); //設(shè)置到回放狀態(tài) replay(personalIncomeTax); //驗證計算工資方法計算是否正確。 Assert.assertEquals(8000.00-1520.00-193.00, accountant.calculateSalary(8000.00)); verify(personalIncomeTax); } } |
4. 執(zhí)行測試
最后是最簡單的一步了。右鍵點擊AccountantTest.java,Run As —> JUnit Test。得到下面的成功界面。
PS:到上面一步,單元測試已經(jīng)是完成了。擁有好奇心的你還可以testCalculateSalary()方法里的數(shù)值去看看如果單元測試不通過會報什么錯。
比如,改一下所傳的參數(shù)personalIncomeTax.calculate(8000.00,1520.00)變?yōu)閜ersonalIncomeTax.calculate(9000.00,1520.00)。
改一下斷言什么的,報錯又會是什么。Assert.assertEquals(8000.00-1520.00-193.00, accountant.calculateSalary(8000.00));
具體的EasyMock文檔在網(wǎng)絡(luò)上已經(jīng)漫天飛。自己去找找,深入了解下EasyMock。
posted on 2014-12-22 23:43 順其自然EVO 閱讀(409) 評論(0) 編輯 收藏 所屬分類: 測試學(xué)習(xí)專欄