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

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

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

    隨筆 - 4  文章 - 16  trackbacks - 0
    <2008年11月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    新聞檔案

    好友

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 11208
    • 排名 - 2286

    最新評論

    閱讀排行榜

    評論排行榜

    本節(jié)是單元測試系列的第二篇。重點講解如何使用Mock/Stub和依賴注入技術進行單元測試。關于工具JUnit等則不做累贅介紹。 希望通過本章能夠幫助大家開始單元測試的有益實踐,與大家共勉!

    單元測試(技能篇)

    一、Stub技術

    這是最為古老的一種測試技能。通過類層次上的替換實現了對待測環(huán)境的模擬。

    實現的時候有兩種途徑:

    1、重寫實際類,在測試時,先于實際類加載,即覆蓋。如:我們在unittest/stub文件夾下針對于每一個重寫類都有相同的包結構和類名:


    在類路徑中優(yōu)先加載:


    2、在實際代碼中添加判斷。比如,如果當前是測試環(huán)境if(isUT)執(zhí)行XX操作,截斷真正需要做的事。

        publicvoid sendCommand(int cmdCode)

        {

           if(isUT())

           {

               //...

           }

           else

           {

               //...

           }

        }

    Stub技術的問題就在于我們在重寫這些類的時候,不僅僅要關注接口,還要關注其內部邏輯。如果你只是簡單的返回一個固定的響應,會很簡單。但是對于每一次運行需要根據不同的輸入返回不同的輸出時方法內部的處理就會復雜的多。

    由于實現的難度,所以,使用時就要注意:有高價值、重用度高、數量少。這就是說,重寫一個類,就可以有一大批類可以用。

    二、Mock技術

    Mock是目前單元測試中最常用的。用來在對象層次上實現細類度替換十分方便。

    當我們在測試中,需要其它類/接口的一個方法時,我們可以通過繼承/實現其一個子類對象來替換實際對象。在Mock子類中將需要的方法直接返回需要的結果就行了。

        privateclass Mock_QueryCtrl extends QueryCtrl

        {

           public List queryNEList()

           {

               List neList = new ArrayList();

               //直接填充并返回你需要的數據...

               return neList;

           }

        }

    同樣,我們也可以通過測試待測類的子類來測試待測類。這對于被測方法使用了自身類的方法時很適用。

    三、依賴注入

    單元測試的一個關鍵就是替換。類層次上的替換,通過在類路徑中提前加載就可以實現。而在對象層次上,java的反射機制提供了很好的幫助。

    1.獲取/注入私有屬性

    2.執(zhí)行私有方法

    附:注入私有屬性的實現:

        publicvoid setFieldObject(Object instance, String fieldName, Object value)

               throws IllegalArgumentException, IllegalAccessException,

               NoSuchFieldException {

           Field field = null;

           Class c = instance.getClass();

           do {

               try

               {

                  field = c.getDeclaredField(fieldName);

               } catch (SecurityException e)

               {

                  e.printStackTrace();

               } catch (NoSuchFieldException e)

               {

                  c = c.getSuperclass();

               }

           }

           while (c.getName() != "java.lang.Object" && field == null);

           if (field != null)

           {

               field.setAccessible(true);

               field.set(instance, value);

           }

           else

           {

               thrownew NoSuchFieldException(fieldName);

           }

        }

    注:這是一個簡單實現,實際中需要優(yōu)化。

    四、實例:

    下例演示了如何測試類NEListTableShowNETable()方法。其中注意的是,方法中調用了類QueryCtrlqueryNEList()方法。

    待測類:

    publicclass NEListTable

    {

        QueryCtrl ctrl = null;

       

        publicvoid ShowNETable()

        {

           List neList = ctrl.queryNEList();

          

           for(int i = 0;i<neList.size();i++)

           {

               //neList轉換為表格行

           }

          

           //顯示表格...

        }

    }

    publicclass QueryCtrl {

        public List queryNEList()

    {

           returnnull;

        }

    }

    測試類:

    public class TestNEListTable extends TestCase

    {

        private NEListTable table = null;

        private TestHelper helper = null;

        public void testShowNETable()

        {

           Mock_QueryCtrl ctrl = new Mock_QueryCtrl();

           helper.setObjectField(table,"ctrl",ctrl);//Mock對象注入table

           table.ShowNETable();

           assertTrue(table.getRowCount()>0);

        }

       

        private class Mock_QueryCtrl extends QueryCtrl

        {

           public List queryNEList()

           {

               List neList = new ArrayList();

               //返回你需要的數據...

               return neList;

           }

        }

    }

    posted on 2008-07-10 22:14 wukaichun 閱讀(2023) 評論(4)  編輯  收藏 所屬分類: test

    FeedBack:
    # re: 單元測試(技能篇) 2008-07-21 21:34 切爾斯基
    Mock不是你說的這個樣子吧, 你這里說的mock其實是stub  回復  更多評論
      
    # re: 單元測試(技能篇) 2008-07-21 23:19 wukaichun
    @切爾斯基

    非常感謝.不知您的見解是什么?
    我的理解是:Stub的替換發(fā)生在類層面,而Mock則是對象層面. 前者粒度較大,更適合功能測試級;后者粒度相對較小,對于方法級的單元測試比較有效.
      回復  更多評論
      
    # re: 單元測試(技能篇) 2008-07-28 22:42 Growing
    沒錯,同意"切爾斯基"的說法,樓主的Mock其實就是Stub,Mock與Stub的區(qū)別我認為是在于:Mock不需要像Stub那樣增加類。而是通過目前使用較多的EasyMock和JMock等框架,通過動態(tài)代理等方式生成代理類,使用這個代理類代替被測試類的依賴對象。保證測試的獨立、隔離。  回復  更多評論
      
    # re: 單元測試(技能篇) 2008-11-19 14:54 網絡監(jiān)控軟件
    能不能介紹一些C++的單元測試框架。  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 久久精品国产亚洲AV麻豆王友容| 国产又大又粗又硬又长免费 | 亚洲一区二区免费视频| 中文字幕在线免费观看视频| 亚洲精品国产高清嫩草影院| 人妻仑刮八A级毛片免费看| 亚洲成网777777国产精品| 一区二区三区在线观看免费| 精品国产亚洲男女在线线电影 | 在线观看亚洲电影| 夜色阁亚洲一区二区三区| 高h视频在线免费观看| 亚洲日韩在线第一页| a在线观看免费网址大全| 久久久久久久久亚洲| 国产大片91精品免费观看不卡| 国产精品亚洲综合五月天| 免费看无码自慰一区二区| 白白色免费在线视频| 国产aⅴ无码专区亚洲av麻豆| 国产免费爽爽视频在线观看| 亚洲综合视频在线| 日韩精品免费电影| 亚洲免费视频一区二区三区| 久久九九亚洲精品| 男人的好免费观看在线视频| 污污视频免费观看网站| 久久91亚洲精品中文字幕| 拨牐拨牐x8免费| 国产精品成人啪精品视频免费 | 精品国产日韩亚洲一区在线| 久久精品夜色噜噜亚洲A∨| 在线免费观看国产| 亚洲av无码一区二区三区人妖| 亚洲色精品vr一区二区三区| 国产精品视频免费| jzzjzz免费观看大片免费| 亚洲色图综合网站| 亚洲综合精品网站在线观看| 国产成人精品免费视频动漫 | 18国产精品白浆在线观看免费 |