<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年1月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    第一個(gè)Blog,記錄哈哈的生活

    常用鏈接

    留言簿(16)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    Java links

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

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

    準(zhǔn)備:
    先弄個(gè)接口 Haha 用來(lái) Mock 的,兩個(gè)方法
    void haha(String s);
    String hehe(String s);

    開(kāi)始 Mock:

    靜態(tài)導(dǎo)入 EasyMock
    import static org.easymock.EasyMock.*;

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

    無(wú)返回值的調(diào)用可以直接調(diào)用 Mock 方法

    haha.haha("haha");

    有返回值的可以

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

    這樣做完后

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

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

    全部調(diào)用完了,使用 verify(haha); 查看一下預(yù)期的調(diào)用是不是都調(diào)了,如果預(yù)期要調(diào)用一次,卻沒(méi)調(diào),那就會(huì) AssertionError 哦。

    調(diào)用次數(shù)

    上面這些都是默認(rèn)調(diào)用一次,就相當(dāng)于 expect(haha.hehe("hehe")).andReturn("ok").times(1); 或 expect(haha.hehe("hehe")).andReturn("ok").once();

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

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

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

    預(yù)期的結(jié)果

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

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

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

    調(diào)用順序

    不過(guò)如上面所說(shuō),haha.haha("haha") 與 haha.hehe("hehe") 是沒(méi)有順序的,將 createMock 改成 createStrictMock 或在 createMock 后面加一行 checkOrder(haha,true) 就可以了,這時(shí),就一定要按照定義的順序來(lái)調(diào)用了。

    如果多個(gè)不同的 mock 也要保證順序呢?那就不能使用 createMock 來(lái)創(chuàng)建這些 mock 了,因?yàn)槊看?createMock 都會(huì)使用一個(gè)新的 IMocksControl 實(shí)例來(lái)單獨(dú)控制這個(gè) mock ,我們希望將多個(gè) mock 用同一個(gè) IMocksControl 控制,只需要

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

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

    ctrl.replay();

    就可以了

    預(yù)期的參數(shù)

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

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

    將方法弄成 Stub

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

    友好的Mock

    我們使用 createMock 創(chuàng)建出來(lái)的 mock 對(duì)象,如果沒(méi)有錄過(guò),調(diào)用這個(gè)方法都會(huì)出 AssertionError ,但如果使用 createNiceMock 就不會(huì)了,會(huì)返回 0 , null , false 這樣的。
    posted on 2007-01-18 23:03 哈哈的日子 閱讀(3071) 評(píng)論(5)  編輯  收藏 所屬分類: Java

    FeedBack:
    # re: EasyMock 使用 2007-01-19 09:44 Feng
    好文章呀,如果樓主再給一個(gè)結(jié)合junit的例子就完美了,因?yàn)槲铱赐甑谝槐榈臅r(shí)候并沒(méi)有理解清楚mock與測(cè)試目標(biāo)之間的關(guān)系。  回復(fù)  更多評(píng)論
      
    # re: EasyMock 使用 2007-01-19 22:58 errorfun
    @Feng
    Mock可以模擬一個(gè)環(huán)境,在重現(xiàn)WEB應(yīng)用中的某些特殊BUG時(shí)很有用。  回復(fù)  更多評(píng)論
      
    # re: EasyMock 使用 2007-01-23 23:40 小車馬
    恩,mock應(yīng)用也是越來(lái)越多了,呵呵

    樓主,潛力貼論壇(http://content.uu1001.com)是我個(gè)人的一個(gè)設(shè)想,如果你對(duì)java非常的專注,并且愿意交我這個(gè)朋友,可以發(fā)郵件給我(lbw070105@gmail.com),希望我們可以一起發(fā)展它。  回復(fù)  更多評(píng)論
      
    # re: EasyMock 使用 2007-05-22 14:11 itVincent
    剛想了解這個(gè)mock,博主的文章寫(xiě)得挺淺白  回復(fù)  更多評(píng)論
      
    # re: EasyMock 使用 2007-11-19 17:45 ticky
    如果返回的是數(shù)組,好像無(wú)法實(shí)現(xiàn)吧?  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 最新亚洲人成无码网站| 亚洲一级特黄特黄的大片| 免费夜色污私人影院网站| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 亚洲欧洲在线播放| 久久免费视频精品| 亚洲亚洲人成综合网络| 久久久久久噜噜精品免费直播| 亚洲天堂中文字幕在线| 中国一级毛片视频免费看| 国产亚洲大尺度无码无码专线 | 国产精品亚洲专一区二区三区| 国产区卡一卡二卡三乱码免费| 日韩色日韩视频亚洲网站| 九月婷婷亚洲综合在线| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 国产免费观看a大片的网站| 亚洲爆乳无码精品AAA片蜜桃| 麻豆国产入口在线观看免费| 欧美亚洲精品一区二区| 免费中文字幕一级毛片| 成人免费一区二区三区| 亚洲成a人片77777老司机| 国产中文字幕免费观看| 亚洲AV色欲色欲WWW| 久久久久一级精品亚洲国产成人综合AV区 | 亚洲日韩中文字幕日韩在线| 在线看片免费人成视频久网下载 | 中文字幕在线观看亚洲视频| 特级淫片国产免费高清视频| 人禽伦免费交视频播放| 亚洲天堂视频在线观看| 成人片黄网站A毛片免费| 成人特级毛片69免费观看| 久久亚洲精品AB无码播放| 中文字幕无码免费久久99| 美女无遮挡免费视频网站| 亚洲AV日韩AV高潮无码专区| 成人免费视频试看120秒| 国产日韩在线视频免费播放| 亚洲国产成人精品无码区在线秒播 |