隨筆 - 175  文章 - 202  trackbacks - 0
          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

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

          常用鏈接

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Java links

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

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

          開始 Mock:

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

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

          無返回值的調(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)用一次,卻沒調(diào),那就會 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") 時返回 "ok" ,第二次返回 "ok too",第三次調(diào)用就比較慘了,會拋出一個 RuntimeException,需要注意
          的是,如果拋出的異常是 unchecked 的,就是 Runtime 的,就隨便拋,如果是 checked 的,那就一定要拋這個方法定義的,否則會在 andThrow 這行出 IllegalArgumentException 。

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

          調(diào)用順序

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

          如果多個不同的 mock 也要保證順序呢?那就不能使用 createMock 來創(chuàng)建這些 mock 了,因?yàn)槊看?createMock 都會使用一個新的 IMocksControl 實(shí)例來單獨(dú)控制這個 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();

          就可以了

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

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

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

          將方法弄成 Stub

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

          友好的Mock

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

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

          樓主,潛力貼論壇(http://content.uu1001.com)是我個人的一個設(shè)想,如果你對java非常的專注,并且愿意交我這個朋友,可以發(fā)郵件給我(lbw070105@gmail.com),希望我們可以一起發(fā)展它。  回復(fù)  更多評論
            
          # re: EasyMock 使用 2007-05-22 14:11 itVincent
          剛想了解這個mock,博主的文章寫得挺淺白  回復(fù)  更多評論
            
          # re: EasyMock 使用 2007-11-19 17:45 ticky
          如果返回的是數(shù)組,好像無法實(shí)現(xiàn)吧?  回復(fù)  更多評論
            
          主站蜘蛛池模板: 扶沟县| 钦州市| 镇江市| 定安县| 集安市| 峨山| 广元市| 肇源县| 阆中市| 赣州市| 当阳市| 大悟县| 上林县| 兴文县| 罗田县| 沙雅县| 余庆县| 宜都市| 海伦市| 宜兰市| 尖扎县| 怀集县| 集安市| 水富县| 兴国县| 临潭县| 连江县| 文水县| 石河子市| 治县。| 泊头市| 会理县| 三都| 林甸县| 增城市| 镇沅| 三河市| 鞍山市| 卓资县| 泗洪县| 华容县|