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

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

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

    Calvin's Tech Space

    成于堅忍,毀于浮躁

       :: 首頁 :: 聯系 :: 聚合  :: 管理

    認識Mock Object

    版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
    http://bigwhite.blogbus.com/logs/535124.html

     

    上周六我們Dominoo group討論(以下稱討論)TDDJUnit的時候,提到過Mock Object,那次可能是我第一次聽到Mock Object這個概念,程序員對新鮮的的東西都是敏感的,所以今天晚上花了一些時間了解了一下Mock Object的概念,做了一些簡單實踐。

     

    術語

    Tested Object – 被測對象

    Mock – 假的 or 仿制的對象

     

    What is Mock Object?

    在討論中我大致了解到Mock Object一般是用來做輔助單元測試,它負責隔離Tested Object與真實環境中模塊或實體(Real world object)的交互,并“替代”or “冒充這些真實模塊或實體與Tested Object進行交互。

    在“JUnit in action”這本書中關于Mock Object的描述如下:

    A mock object (or mock for short) is an object created to stand in for an object that your code will be collaborating with. Your code can call methods on the mock object, which will deliver results as set up by your tests.

     

    Mock Object給我帶來什么好處?

     

    看看下面的圖:

    |-----------------------------------------------------------------|

    |                                                                                         |                   

    |      |---------------------|                                                  |             |-----------------------------|

    |      |   Tested             | <------------------------------------------à | External Mock Object |

    |      |      Object            |                                                    |            |----------------------------|

    |      |---------------------|                                                 |

    |                   /|\               |--------------------|                       |

    |                    |-------|  Internal Mock    |                       |

    |                                     |     Object           |                       |

    |                                     |--------------------|                    |

    |      [Your system scope]                                                  |

    |--------------------------------------------------------- --------|

     

    在測試你的Tested Object時,你可能會與你系統內的某個模塊或系統外某個實體交互,而這些模塊或實體在你做單元測試的時候可能并不存在,這時:

    Ø         Internal Mock Object可能是一個你的系統尚未完成的模塊的“替身”(replacement);

    Ø         External Mock Object可能是測試你的Tested Object時需要的外部的環境實體的“替身”(replacement)。

    不知道這樣給Mock Object分類是否正確J

     

    我們來看看與Real world object交互有什么不足之處:

    Ø         Real world object的行為具有不確定性,我們難于控制它們的輸出or返回結果。

    Ø         Real world object有些時候是難于被建立的或者說是無法獲得的。

    Ø         Real world object的有些行為難于被觸發,如磁盤已滿,網絡error等。

    Ø         Real world object可能不存在,比如你的Tested Object需要與你的系統的另一個module交互,而另一個module尚未開發完畢。

     

    當然還不止這些,我們僅僅是列出一部分。

     

    使用Mock Object替代Real world object后我們就會解決上述問題,換句話說當上面的情況出現后,我們就可以使用Mock Object。這也是什么時候該使用Mock Objectanswer

    Mock Object是我們自己編寫的,我們擁有控制它的絕對的權力,我們可以定制它的行為和輸出。

     

    Use Mock Object

    使用Mock Object解決上述問題可分三步走:

     

    1. Use an interface to describe the object

    2. Implement the interface for production code

    3. Implement the interface in a mock object for testing [3]

    還有一點就是對于Internal Mock Object早晚你要實現出其Real world object的,因為那是你系統的一部分。

     

    一個改自資料[3]的例子

    public interface Environmental {

    public long getTime();

    // Other methods omitted...

    }

    對于這樣一個接口,我們提供兩種實現,

    //real world object

    public class SystemEnvironment implements Environmental {

    public long getTime() {

    return System.currentTimeMillis();

    }

    // other methods ...

    }

     

    //mock object

    public class MockSystemEnvironment implements Environmental {

    public long getTime() {

    return currentTime;

    }

    public void setTime(Time aTime){

             this.currentTime = aTime;

    }

    private Time currentTime;

    //others

    }

    我們可以看到在MockSystemEnvironment中我們提供“setTime”函數是為了提供控制Mock Object的接口。

     

    我們要測試的類

    //TestedObject

    public class TestedObject{

             private Environmental env;

             TestedObject(Environmental aEnv){

                       this.env = aEnv;

    }

    public boolean isAm(){

             Calendar cal = Calendar.getInstance();

    cal.setTimeInMillis(env.getTime());

    int hour = cal.get(Calendar.HOUR_OF_DAY);

             if (hour <=12) return true;

             return false;

    }

    }

     

    將要測試的類放入單元測試框架

    public class TestTestedObject extends TestCase {

            public void testIsAm(){

                      MockSystemEnvironment env = new MockSystemEnvironment();

                       // Set up a target test time

    Calendar cal = Calendar.getInstance();

    cal.set(Calendar.YEAR, 2004);

    cal.set(Calendar.MONTH, 10);

    cal.set(Calendar.DAY_OF_MONTH, 1);

    cal.set(Calendar.HOUR_OF_DAY, 16);

    cal.set(Calendar.MINUTE, 55);

    long t1 = cal.getTimeInMillis();

    env.setTime(t1);

     

                       TestedObject to = new TestedObject(env);

                       assertFalse(to.isAm());

    }

    }

    在該單元測試中我們使用了Mock Object,并且在使用前我們利用setTime接口,輸入了我們需要的值。結果我們會通過測試。如果我們使用Real Object,我們得到的測試結果將是不固定的,后者可不是所期望的。從這個例子中你也應該體會到Mock object的一些好處了。

     

    如果我們總是手動寫我們需要的Mock Object,那將是一個很大的工作量?,F在業界有了Mock Objectseasy mock等開源框架的支持,是我們編寫Mock object變得越來越容易。

     

    參考資料:

    1、《Test-Driven Development – A practical guide

    2、《JUnit in action

    3、《Pragmatic Unit Testing

    posted on 2009-08-16 16:16 calvin 閱讀(556) 評論(0)  編輯  收藏 所屬分類: 軟件測試

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲人成人网站色www| 亚洲午夜久久久精品电影院| a级毛片在线免费| 久久青青草原亚洲av无码app | 国产h视频在线观看网站免费| 亚洲色大情网站www| 综合亚洲伊人午夜网 | 蜜臀AV免费一区二区三区| 亚洲欧美日韩久久精品| 中文字幕亚洲乱码熟女一区二区 | 亚洲一区二区女搞男| 黄+色+性+人免费| 看全免费的一级毛片| 亚洲AV无码一区二区二三区软件| 毛片a级毛片免费播放100| ssswww日本免费网站片| 亚洲国产成人精品青青草原| 亚洲AⅤ优女AV综合久久久| 91福利视频免费| eeuss影院免费直达入口| 亚洲欧洲日韩国产一区二区三区 | 亚洲制服丝袜中文字幕| 亚洲伊人色欲综合网| 日本特黄特黄刺激大片免费| 免费A级毛片无码A∨| 乱爱性全过程免费视频| 久久亚洲精品国产亚洲老地址| 亚洲区小说区图片区QVOD| 好爽好紧好大的免费视频国产| 香港a毛片免费观看| 日韩毛片一区视频免费| 最新亚洲卡一卡二卡三新区| 亚洲成人午夜在线| 亚洲日韩国产成网在线观看| 午夜神器成在线人成在线人免费| 一区二区三区观看免费中文视频在线播放| 黄色毛片视频免费| 亚洲妇女无套内射精| 亚洲免费中文字幕| 亚洲视频在线观看免费| 亚洲精品卡2卡3卡4卡5卡区|