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

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

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

    隨筆 - 175  文章 - 202  trackbacks - 0
    <2007年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    第一個Blog,記錄哈哈的生活

    常用鏈接

    留言簿(16)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    Java links

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    背景:
    EasyMock 2 版本必須要 JDK5 才能使用 EasyMock 1.2 可以在 JDK 1.4 使用
    也可以使用 Retrotranslator 將 EasyMock 2 版本改為 JDK 1.4 也可以使用的。
    目前使用的是 EasyMock 2.2

    準備:
    先弄個接口 Haha 用來 Mock 的,兩個方法
    void haha(String s);
    String hehe(String s);

    開始 Mock:

    靜態導入 EasyMock
    import static org.easymock.EasyMock.*;

    然后
    Haha haha=createMock(Haha.class);

    無返回值的調用可以直接調用 Mock 方法

    haha.haha("haha");

    有返回值的可以

    expect(haha.hehe("hehe")).andReturn("ok");

    這樣做完后

    你要 replay(haha); 一下,表示錄完 mock ,準備重放了。

    就可以調用 haha.haha("haha") 了,同樣的,調用 haha.hehe("hehe") 的返回值是 "ok"

    全部調用完了,使用 verify(haha); 查看一下預期的調用是不是都調了,如果預期要調用一次,卻沒調,那就會 AssertionError 哦。

    調用次數

    上面這些都是默認調用一次,就相當于 expect(haha.hehe("hehe")).andReturn("ok").times(1); 或 expect(haha.hehe("hehe")).andReturn("ok").once();

    如果想調用任意次,就 expect(haha.hehe("hehe")).andReturn("ok").anyTimes();

    如果想最少調用一次,就 expect(haha.hehe("hehe")).andReturn("ok").atLeastOnce();

    如果想調用 1 至 3?次,就 expect(haha.hehe("hehe")).andReturn("ok").times(1,3);

    預期的結果

    還可以 expect(haha.hehe("hehe")).andReturn("ok").andReturn("ok too").andThrow(new RuntimeException());

    這樣,第一次調用 haha.hehe("hehe") 時返回 "ok" ,第二次返回 "ok too",第三次調用就比較慘了,會拋出一個 RuntimeException,需要注意
    的是,如果拋出的異常是 unchecked 的,就是 Runtime 的,就隨便拋,如果是 checked 的,那就一定要拋這個方法定義的,否則會在 andThrow 這行出 IllegalArgumentException 。

    終極解決辦法還可以使用 andAnswer(IAnswer<T> answer)?傳一個實現 IAnswer 接口的實例,這個接口只有一個方法
    T answer() throws Throwable;
    隨便你返回什么,或是拋出什么異常。

    調用順序

    不過如上面所說,haha.haha("haha") 與 haha.hehe("hehe") 是沒有順序的,將 createMock 改成 createStrictMock 或在 createMock 后面加一行 checkOrder(haha,true) 就可以了,這時,就一定要按照定義的順序來調用了。

    如果多個不同的 mock 也要保證順序呢?那就不能使用 createMock 來創建這些 mock 了,因為每次 createMock 都會使用一個新的 IMocksControl 實例來單獨控制這個 mock ,我們希望將多個 mock 用同一個 IMocksControl 控制,只需要

    IMocksControl ctrl = createStrictControl();
    Haha?haha1= ctrl.createMock(Haha?.class);
    Haha?haha2 = ctrl.createMock(Haha?.class);

    haha1.haha("haha1");
    haha2.haha("haha2");

    ctrl.replay();

    就可以了

    預期的參數

    剛才 haha.haha("haha") 中的 "haha" 就是預期的參數,EasyMock 提供了很多預期參數的方法,比如 haha.haha(eq("haha")),與前面的方法功能完全一樣
    haha.haha((String)anyObject) ?隨便你傳什么參數都沒問題。
    haha.haha(not(eq("haha"))) 這個只要不傳 haha ,其它什么都成

    同樣可以自定義,只要調用 ??? public static void reportMatcher(IArgumentMatcher matcher) 方法,將自定義的 IArgumentMatcher? 傳進去就可以了,這個接口有兩個方法 boolean matches(Object argument)??和 void appendTo(StringBuffer buffer) 第一個方法的參數是調用實際傳入的值,返回是否匹配,第二個方法是錯誤時向 buffer 中 append 錯誤信息。

    將方法弄成 Stub

    Stub 方法,我想應該就是隨便調,愛怎么調就怎么調,返回的都是那個值,最后也不會驗證到底調用了多少次。
    如果想把一個方法弄成 Stub,無返回值的只要 asStub() 就是 expect(haha.haha("haha")).asStub() ,有返回值的就 andStubReturn() , andStubAnswer() 這樣就可以了。

    友好的Mock

    我們使用 createMock 創建出來的 mock 對象,如果沒有錄過,調用這個方法都會出 AssertionError ,但如果使用 createNiceMock 就不會了,會返回 0 , null , false 這樣的。
    posted on 2007-01-18 23:03 哈哈的日子 閱讀(3073) 評論(5)  編輯  收藏 所屬分類: Java

    FeedBack:
    # re: EasyMock 使用 2007-01-19 09:44 Feng
    好文章呀,如果樓主再給一個結合junit的例子就完美了,因為我看完第一遍的時候并沒有理解清楚mock與測試目標之間的關系。  回復  更多評論
      
    # re: EasyMock 使用 2007-01-19 22:58 errorfun
    @Feng
    Mock可以模擬一個環境,在重現WEB應用中的某些特殊BUG時很有用。  回復  更多評論
      
    # re: EasyMock 使用 2007-01-23 23:40 小車馬
    恩,mock應用也是越來越多了,呵呵

    樓主,潛力貼論壇(http://content.uu1001.com)是我個人的一個設想,如果你對java非常的專注,并且愿意交我這個朋友,可以發郵件給我(lbw070105@gmail.com),希望我們可以一起發展它。  回復  更多評論
      
    # re: EasyMock 使用 2007-05-22 14:11 itVincent
    剛想了解這個mock,博主的文章寫得挺淺白  回復  更多評論
      
    # re: EasyMock 使用 2007-11-19 17:45 ticky
    如果返回的是數組,好像無法實現吧?  回復  更多評論
      
    主站蜘蛛池模板: 亚洲一区二区三区高清在线观看 | 久久精品熟女亚洲av麻豆| 亚洲免费视频网站| 中文字幕成人免费高清在线 | 亚洲AV无码不卡在线播放| 国产三级在线免费观看| 中文字幕亚洲一区二区三区| h片在线播放免费高清| 不卡精品国产_亚洲人成在线| 国产国产人免费人成成免视频| 亚洲精品成人网久久久久久| 国产高潮流白浆喷水免费A片 | 亚洲中久无码永久在线观看同| 国产裸体美女永久免费无遮挡| 国产亚洲一区二区三区在线不卡| 中文字幕手机在线免费看电影| 亚洲爱情岛论坛永久| 亚洲成年人免费网站| 在线综合亚洲欧洲综合网站| 国产免费小视频在线观看| 一级毛片在线播放免费| 亚洲成av人在线视| 免费福利在线播放| 日韩欧美亚洲中文乱码| 亚洲精品乱码久久久久久不卡| 国产在线观看免费av站| 亚洲精品亚洲人成在线观看麻豆| 97在线线免费观看视频在线观看| 国产精品无码亚洲精品2021| 色噜噜亚洲精品中文字幕 | AAA日本高清在线播放免费观看 | 亚洲av永久无码精品秋霞电影秋| 四虎永久免费网站免费观看| 韩国免费A级毛片久久| 亚洲日产2021三区| 免费播放特黄特色毛片| 日韩内射激情视频在线播放免费 | 亚洲国产精品视频| 30岁的女人韩剧免费观看| 综合偷自拍亚洲乱中文字幕| 亚洲精品国产精品乱码不99|