您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 >
EasyMock使用方法與原理剖析
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/2/21 13:32:40 ] 推薦標(biāo)簽:

Mock 方法是單元測試中常見的一種技術(shù),它的主要作用是模擬一些在應(yīng)用中不容易構(gòu)造或者比較復(fù)雜的對象,從而把測試與測試邊界以外的對象隔離開。

編寫自定義的 Mock 對象需要額外的編碼工作,同時(shí)也可能引入錯(cuò)誤。EasyMock 提供了根據(jù)指定接口動(dòng)態(tài)構(gòu)建 Mock 對象的方法,避免了手工編寫 Mock 對象。本文將向您展示如何使用 EasyMock 進(jìn)行單元測試,并對 EasyMock 的原理進(jìn)行分析。

1.Mock 對象與 EasyMock 簡介

單元測試與 Mock 方法

單元測試是對應(yīng)用中的某一個(gè)模塊的功能進(jìn)行驗(yàn)證。在單元測試中,我們常遇到的問題是應(yīng)用中其它的協(xié)同模塊尚未開發(fā)完成,或者被測試模塊需要和一些不容易構(gòu)造、比較復(fù)雜的對象進(jìn)行交互。另外,由于不能肯定其它模塊的正確性,我們也無法確定測試中發(fā)現(xiàn)的問題是由哪個(gè)模塊引起的。

Mock 對象能夠模擬其它協(xié)同模塊的行為,被測試模塊通過與 Mock 對象協(xié)作,可以獲得一個(gè)孤立的測試環(huán)境。此外,使用 Mock 對象還可以模擬在應(yīng)用中不容易構(gòu)造(如 HttpServletRequest 必須在 Servlet 容器中才能構(gòu)造出來)和比較復(fù)雜的對象(如 JDBC 中的 ResultSet 對象),從而使測試順利進(jìn)行。

EasyMock 簡介

手動(dòng)的構(gòu)造 Mock 對象會(huì)給開發(fā)人員帶來額外的編碼量,而且這些為創(chuàng)建 Mock 對象而編寫的代碼很有可能引入錯(cuò)誤。目前,有許多開源項(xiàng)目對動(dòng)態(tài)構(gòu)建 Mock 對象提供了支持,這些項(xiàng)目能夠根據(jù)現(xiàn)有的接口或類動(dòng)態(tài)生成,這樣不僅能避免額外的編碼工作,同時(shí)也降低了引入錯(cuò)誤的可能。

EasyMock 是一套用于通過簡單的方法對于給定的接口生成 Mock 對象的類庫。它提供對接口的模擬,能夠通過錄制、回放、檢查三步來完成大體的測試過程,可以驗(yàn)證方法的調(diào)用種類、次數(shù)、順序,可以令 Mock 對象返回指定的值或拋出指定異常。通過 EasyMock,我們可以方便的構(gòu)造 Mock 對象從而使單元測試順利進(jìn)行。

安裝 EasyMock

EasyMock 是采用 MIT license 的一個(gè)開源項(xiàng)目,您可以在 Sourceforge 上下載到相關(guān)的 zip 文件。目前您可以下載的 EasyMock 新版本是2.3,它需要運(yùn)行在 Java 5.0 平臺(tái)上。如果您的應(yīng)用運(yùn)行在 Java 1.3 或 1.4 平臺(tái)上,您可以選擇 EasyMock1.2。在解壓縮 zip 包后,您可以找到 easymock.jar 這個(gè)文件。如果您使用 Eclipse 作為 IDE,把 easymock.jar 添加到項(xiàng)目的 Libraries 里可以使用了(如下圖所示)。此外,由于我們的測試用例運(yùn)行在 JUnit 環(huán)境中,因此您還需要 JUnit.jar(版本3.8.1以上)。

圖1:Eclipse 項(xiàng)目中的 Libraries

2.使用 EasyMock 進(jìn)行單元測試

通過 EasyMock,我們可以為指定的接口動(dòng)態(tài)的創(chuàng)建 Mock 對象,并利用 Mock 對象來模擬協(xié)同模塊或是領(lǐng)域?qū)ο螅瑥亩箚卧獪y試順利進(jìn)行。這個(gè)過程大致可以劃分為以下幾個(gè)步驟:

    使用 EasyMock 生成 Mock 對象;
    設(shè)定 Mock 對象的預(yù)期行為和輸出;
    將 Mock 對象切換到 Replay 狀態(tài);
    調(diào)用 Mock 對象方法進(jìn)行單元測試;
    對 Mock 對象的行為進(jìn)行驗(yàn)證。

接下來,我們將對以上的幾個(gè)步驟逐一進(jìn)行說明。除了以上的基本步驟外,EasyMock 還對特殊的 Mock 對象類型、特定的參數(shù)匹配方式等功能提供了支持,我們將在之后的章節(jié)中進(jìn)行說明。

使用 EasyMock 生成 Mock 對象

根據(jù)指定的接口或類,EasyMock 能夠動(dòng)態(tài)的創(chuàng)建 Mock 對象(EasyMock 默認(rèn)只支持為接口生成 Mock 對象,如果需要為類生成 Mock 對象,在 EasyMock 的主頁上有擴(kuò)展包可以實(shí)現(xiàn)此功能),我們以 ResultSet 接口為例說明EasyMock的功能。java.sql.ResultSet 是每一個(gè) Java 開發(fā)人員都非常熟悉的接口:

清單1:ResultSet 接口

               
public interface java.sql.ResultSet {
......
public abstract java.lang.String getString(int arg0) throws java.sql.SQLException;
public abstract double getDouble(int arg0) throws java.sql.SQLException;
......
}


通常,構(gòu)建一個(gè)真實(shí)的 RecordSet 對象需要經(jīng)過一個(gè)復(fù)雜的過程:在開發(fā)過程中,開發(fā)人員通常會(huì)編寫一個(gè) DBUtility 類來獲取數(shù)據(jù)庫連接 Connection,并利用 Connection 創(chuàng)建一個(gè) Statement。執(zhí)行一個(gè) Statement 可以獲取到一個(gè)或多個(gè) ResultSet 對象。這樣的構(gòu)造過程復(fù)雜并且依賴于數(shù)據(jù)庫的正確運(yùn)行。數(shù)據(jù)庫或是數(shù)據(jù)庫交互模塊出現(xiàn)問題,都會(huì)影響單元測試的結(jié)果。

我們可以使用 EasyMock 動(dòng)態(tài)構(gòu)建 ResultSet 接口的 Mock 對象來解決這個(gè)問題。一些簡單的測試用例只需要一個(gè) Mock 對象,這時(shí),我們可以用以下的方法來創(chuàng)建 Mock 對象:

ResultSet mockResultSet = createMock(ResultSet.class);


其中 createMock 是 org.easymock.EasyMock 類所提供的靜態(tài)方法,你可以通過 static import 將其引入(注:static import 是 java 5.0 所提供的新特性)。

上一頁12345下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd