EasyMock構建單元測試
1. 背景
單元測試作為程序的基本保障。很多時候構建測試場景是一件令人頭疼的事。因為之前的單元測試都是內部代碼引用的,環境自給自足。開發到了一定程度,你不得不到開始調用外部的接口來完成你的功能。而外部條件是不穩定的。你為了模擬外部環境要創建各種文件、各種數據。嚴重影響到單元測試的效率。EasyMock應運而生,他提供了模擬的接口和類。不用費神去構建各種煩人的環境,就能開展有效的測試。
2. 準備環境
Easymock 3.2 + JUnit 4.11
3. 構建測試
a) 實際場景
i. 你負責開發一個會計師的功能。但計算個人所得稅的接口由外部提供(鬼知道項目經理是怎么想的)。
ii. 你的代碼已經開發完成了。負責開發個人所得稅的接口的同事老婆生了四胞胎,天天請假帶孩子。接口沒寫完。
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。
posted on 2014-12-22 23:43 順其自然EVO 閱讀(410) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄