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

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

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

    Sky's blog

    我和我追逐的夢

    常用鏈接

    統(tǒng)計

    其他鏈接

    友情鏈接

    最新評論

    easymock教程-mock的限制

        easymock并不是萬能的,在使用easymock時有一些限制需要注意。

    (1) Object方法的限制

        我們都知道java是一個單根繼承體系,Object是所有類的基類。在Object類上有幾個基本的方法,easymock是不能改變其行為的:equals(), hashCode()和toString()。

        即對于easymock創(chuàng)建的mock對象,其equals(), hashCode()和toString()三個方法的行為時已經(jīng)固定了點,不能通過Easymock.expect()來指定這三個方法的行為,即使這三個方法是接口定義的一部分。

        我們來先看一個例子:

       public class Business {
            
    private Service service;

            
    public void execute() {
                System.out.println(
    "service.toString() = " + service.toString());
                System.out.println(
    "service.hashCode() = " + service.hashCode());
            }


            
    public void setService(Service service) {
                
    this.service = service;
            }

        }


        
    private interface Service {

            
    public String toString();

            
    public int hashCode();
        }

        execute()方法將為我們打印出toString()和hashCode()方法的結(jié)果。

    public class LimitationTest {

        
    private Business      business;

        
    private IMocksControl mocksControl;

        
    private Service       service;

        @Before
        
    public void init() {
            business 
    = new Business();
            mocksControl 
    = EasyMock.createStrictControl();
            service 
    = mocksControl.createMock(Service.class);
            business.setService(service);
        }


        @Test
        
    public void testDefaultBehavior() {
            business.execute();
        }


        @Test
        
    public void testCustomizedBehavior() {

            EasyMock.expect(service.toString()).andReturn(
    "Customized toString");
            EasyMock.expect(service.hashCode()).andReturn(
    100000);
            mocksControl.replay();

            business.execute();
            mocksControl.verify();
        }

    }

        測試案例testDefaultBehavior()將為我們打印出mock對象默認(rèn)的行為,輸出如下:

    service.toString() = EasyMock for interface net.sourcesky.study.easymock.tutorial.LimitationTest$Service
    service.hashCode() = 26208195

        可見easymock內(nèi)部已經(jīng)做好了toString()和hashCode()實現(xiàn)。

        在測試案例testCustomizedBehavior()中,我們試圖通過EasyMock.expect()來指定toString()和hashCode()的行為,但是運行時遭遇錯誤:

        java.lang.IllegalStateException: no last call on a mock available
     at org.easymock.EasyMock.getControlForLastCall(EasyMock.java:521)
     at org.easymock.EasyMock.expect(EasyMock.java:499)
     at net.sourcesky.study.easymock.tutorial.LimitationTest.testCustomizedBehavior(LimitationTest.java:51)
     ...

        從"no last call on a mock available"的描述上看,easymock根本沒有把對toString()方法的調(diào)用記錄(record)下來作為一個對mock對象的調(diào)用。

        因此,在使用mock對象時,請注意equals(), hashCode()和toString()三個方法無法更改其行為。

    (2) class mock的限制

        相對于interface mock,class mock下easymock限制更多,除了上面談到的equals(), hashCode()和toString()三個方法外,還有以下限制:

        1. final 方法不能被mock
        2. private 方法不能對mock

    (3) 靜態(tài)方法

        對于靜態(tài)方法,easymock也無法mock其行為。

        由于這個限制,當(dāng)被測試類中有靜態(tài)方法調(diào)用時,典型如單例方法調(diào)用,lookup方式的依賴查找,easymock就會力不從心。從這個角度上,推薦盡量使用IOC 控制反轉(zhuǎn)/ DI依賴注入的方式來實現(xiàn)依賴的獲取,而不要使用lookup的主動查找方式。

        實際開發(fā)中,當(dāng)發(fā)現(xiàn)有因為靜態(tài)方法的限制從而導(dǎo)致easymock無法mock我們期望的行為,造成測試案例"不好寫",“寫不下去”時,請換個角度思考:為什么要用靜態(tài)方法?可不可以改成注入?

    (4) 解決的方法

        如果由于某些原因必須使用靜態(tài)方法或者定制final, private方法的行為,則可以考慮搭配其他mock框架來完成功能。

        以靜態(tài)方法方法為例,一個典型的使用范例是:使用jmockit來定制靜態(tài)方法的行為,指定其返回easymock創(chuàng)建的mock對象,然后使用easymock的標(biāo)準(zhǔn)方式定制這個mock對象的行為。

     

    posted on 2010-11-25 11:12 sky ao 閱讀(3305) 評論(0)  編輯  收藏 所屬分類: software test

    主站蜘蛛池模板: 一个人免费视频在线观看www| 国产伦精品一区二区三区免费迷| 亚洲av无码不卡| 一级毛片免费不卡直观看| 高清国语自产拍免费视频国产| 亚洲最大视频网站| 99re这里有免费视频精品| 亚洲第一AV网站| 中文字幕高清免费不卡视频| 亚洲精品美女久久久久99小说| 亚洲a∨无码精品色午夜| 免费国产成人高清在线观看网站| 亚洲性天天干天天摸| 男人j进入女人j内部免费网站| 中文字幕第13亚洲另类| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 成人免费无码大片a毛片软件| 亚洲日本国产精华液| 最近免费中文在线视频| 久久亚洲中文字幕精品有坂深雪| 最好免费观看高清在线| 亚洲国产AV无码专区亚洲AV| a毛片免费播放全部完整| 亚洲午夜福利717| 国产啪精品视频网站免费尤物 | 老司机午夜免费视频| 免费在线观看的黄色网址| 污污免费在线观看| 亚洲男女内射在线播放| 一道本不卡免费视频| 伊人久久亚洲综合| 成人无码精品1区2区3区免费看 | 亚洲AV无码乱码在线观看代蜜桃| 亚洲天堂免费在线| 亚洲a级成人片在线观看| 免费无码又黄又爽又刺激| 亚洲日本一线产区和二线产区对比| 我要看免费的毛片| 亚洲a无码综合a国产av中文| 免费一区二区视频| 国产精品高清免费网站|