<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sky's blog

    我和我追逐的夢

    常用鏈接

    統計

    其他鏈接

    友情鏈接

    最新評論

    easymock教程-record-replay-verify模型

        record-replay-verify 模型容許記錄mock對象上的操作然后重演并驗證這些操作。這是目前mock框架領域最常見的模型,幾乎所有的mock框架都是用這個模型,有些是現實使用如easymock,有些是隱式使用如jmockit。

        以easymock為例,典型的easymock使用案例一般如下, 援引上一章中的例子:

     

    public class UserServiceImplTest {

    /**
         * this is a classic test case to use EasyMock.
         
    */

        @Test
        
    public void testQuery() {
            User expectedUser 
    = new User();
            expectedUser.setId(
    "1001");
            expectedUser.setAge(
    30);
            expectedUser.setName(
    "user-1001");
            UserDao userDao  
    = EasyMock.createMock(UserDao.class);
            EasyMock.expect(userDao.getById(
    "1001")).andReturn(expectedUser);
            EasyMock.replay(userDao);

            UserServiceImpl  service 
    = new UserServiceImpl();
            service.setUserDao(userDao);
            User user 
    = service.query("1001");
            assertNotNull(user);
            assertEquals(
    "1001", user.getId()); 
            assertEquals(
    30, user.getAge()); 
            assertEquals(
    "user-1001", user.getName()); 

            EasyMock.verify(userDao);
        }

    }



        在這里有兩句非常明顯的調用語句: Easymock.replay(...)和Easymock.verify(...)。這兩個語句將上述代碼分成三個部分,分別對應record-replay-verify 3個階段

        1. record

            User expectedUser = new User();
            expectedUser.setId(
    "1001");
            expectedUser.setAge(
    30);
            expectedUser.setName(
    "user-1001");
            UserDao userDao  
    = EasyMock.createMock(UserDao.class);
            EasyMock.expect(userDao.getById(
    "1001")).andReturn(expectedUser);

     

        這里我們開始創建mock對象,并期望這個mock對象的方法被調用,同時給出我們希望這個方法返回的結果。

        這就是所謂的"記錄mock對象上的操作", 同時我們也會看到"expect"這個關鍵字。

        總結說,在record階段,我們需要給出的是我們對mock對象的一系列期望:若干個mock對象被調用,依從我們給定的參數,順序,次數等,并返回預設好的結果(返回值或者異常).

        2. replay

     

            UserServiceImpl  service = new UserServiceImpl();
            service.setUserDao(userDao);
            User user 
    = service.query("1001");


        在replay階段,我們關注的主要測試對象將被創建,之前在record階段創建的相關依賴被關聯到主要測試對象,然后執行被測試的方法,以模擬真實運行環境下主要測試對象的行為。

        在測試方法執行過程中,主要測試對象的內部代碼被執行,同時和相關的依賴進行交互:以一定的參數調用依賴的方法,獲取并處理返回。我們期待這個過程如我們在record階段設想的交互場景一致,即我們期望在replay階段所有在record階段記錄的行為都將被完整而準確的重新演繹一遍,從而到達驗證主要測試對象行為的目的。

     3. verify

            assertNotNull(user);
            assertEquals(
    "1001", user.getId()); 
            assertEquals(
    30, user.getAge()); 
            assertEquals(
    "user-1001", user.getName()); 
            EasyMock.verify(userDao);

     

        在verify階段,我們將驗證測試的結果和交互行為。

        通常驗證分為兩部分,如上所示: 一部分是驗證結果,即主要測試對象的測試方法返回的結果(對于異常測試場景則是拋出的異常)是否如預期,通常這個驗證過程需要我們自行編碼實現。另一部分是驗證交互行為,典型如依賴是否被調用,調用的參數,順序和次數,這部分的驗證過程通常是由mock框架來自動完成,我們只需要簡單調用即可。

        在easymock的實現中,verify的部分交互行為驗證工作,會提前在replay階段進行:比如未記錄的調用,調用的參數等。如果驗證失敗,則直接結束replay以致整個測試案例。

        record-replay-verify 模型非常好的滿足了大多數測試場景的需要:先指定測試的期望,然后執行測試,再驗證期望是否被滿足。這個模型簡單直接,易于實現,也容易被開發人員理解和接受,因此被各個mock框架廣泛使用。


    posted on 2010-10-15 14:50 sky ao 閱讀(3841) 評論(0)  編輯  收藏 所屬分類: software test

    主站蜘蛛池模板: 中国videos性高清免费| 亚洲免费闲人蜜桃| 国产精品亚洲mnbav网站 | 国产又大又黑又粗免费视频| 成人免费视频88| 日韩午夜免费视频| 又粗又硬又大又爽免费视频播放| 日本免费电影一区| 丁香亚洲综合五月天婷婷| 亚洲欧洲日产国码高潮αv| 国产成人99久久亚洲综合精品 | 2021精品国产品免费观看| 美丽的姑娘免费观看在线播放| 18女人水真多免费高清毛片| 97碰公开在线观看免费视频| 亚洲第一成年免费网站| 免费无码一区二区三区蜜桃大| 国产精品视_精品国产免费| 亚洲精品无码你懂的网站| 亚洲愉拍99热成人精品热久久| 久久夜色精品国产亚洲AV动态图| 久久精品亚洲中文字幕无码麻豆| 亚洲最大在线观看| 亚洲精品国产综合久久久久紧| 污网站在线观看免费| 中国毛片免费观看| 在线观看www日本免费网站| 大香人蕉免费视频75| 一本久到久久亚洲综合| 亚洲精品无码专区在线在线播放| 91情国产l精品国产亚洲区| 一区二区亚洲精品精华液| 日韩大片免费观看视频播放| 十八禁视频在线观看免费无码无遮挡骂过| 99国产精品免费视频观看| 在线a人片天堂免费观看高清 | 亚洲免费在线观看视频| 暖暖在线日本免费中文| 亚洲国产综合无码一区| 亚洲va在线va天堂成人| 三级片免费观看久久|