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

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

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

    Sky's blog

    我和我追逐的夢

    常用鏈接

    統計

    其他鏈接

    友情鏈接

    最新評論

    easymock教程-mock的限制

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

    (1) Object方法的限制

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

        即對于easymock創建的mock對象,其equals(), hashCode()和toString()三個方法的行為時已經固定了點,不能通過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()方法的結果。

    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對象默認的行為,輸出如下:

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

        可見easymock內部已經做好了toString()和hashCode()實現。

        在測試案例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()方法的調用記錄(record)下來作為一個對mock對象的調用。

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

    (2) class mock的限制

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

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

    (3) 靜態方法

        對于靜態方法,easymock也無法mock其行為。

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

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

    (4) 解決的方法

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

        以靜態方法方法為例,一個典型的使用范例是:使用jmockit來定制靜態方法的行為,指定其返回easymock創建的mock對象,然后使用easymock的標準方式定制這個mock對象的行為。

     

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

    主站蜘蛛池模板: 男性gay黄免费网站| 亚洲人成www在线播放| 精品国产免费人成网站| 午夜亚洲av永久无码精品 | 亚洲乳大丰满中文字幕| 中美日韩在线网免费毛片视频 | 亚洲国产综合人成综合网站| 中文亚洲AV片不卡在线观看| 亚洲最大的视频网站| 精品无码国产污污污免费网站| 亚洲最新视频在线观看| 精品无码无人网站免费视频| 亚洲成年人电影在线观看| 国产福利在线免费| 亚洲免费综合色在线视频| 免费黄色大片网站| 日韩免费一区二区三区在线| 久久久久se色偷偷亚洲精品av| 婷婷久久久亚洲欧洲日产国码AV| 亚洲韩国在线一卡二卡| 99re6在线视频精品免费下载| 亚洲国产天堂久久综合网站| 亚洲精品免费在线视频| 亚洲一区二区三区亚瑟| 黄网址在线永久免费观看| 亚洲人成网站在线在线观看| 免费看国产曰批40分钟| 黄色网址免费在线观看| 久久精品蜜芽亚洲国产AV| 最近中文字幕免费mv视频8| 在线91精品亚洲网站精品成人| 国产成人亚洲精品91专区手机| 成在人线av无码免费高潮喷水| 亚洲视频在线观看网址| 最近2019中文免费字幕| 农村寡妇一级毛片免费看视频| 国产偷v国产偷v亚洲高清| 波多野结衣中文字幕免费视频| 日本在线观看免费高清| 亚洲人成在线观看| 免费无码又爽又刺激毛片|