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

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

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

    posts - 11,  comments - 28,  trackbacks - 0

    JpetStore提供了一個整套的測試代碼對于想進行單元測試卻不知道如何進行單元測試的人(me)來說,是一個很好的學習機會。
    JpetStore的單元測試代碼與它的系統源文件是獨立分離的,在test文件夾中。打開文件夾可以很清楚的發現該文件夾的內容組成結構與源文件基本一致。
    JpetStore分為領域層(domain),持久層(peristence),服務層(service),表現層(presentation),它的測試也分這幾個層來進行。下面就按層來學習它的test。
    1、? 領域層(domain)
    由于領域層的代碼主要是用于在各層之間傳遞的類,所以,此層的測試代碼也比較簡單,主要有兩個測試類,BeanTest.java與DomainFixture.java。
    BeanTest.java類主要是利用包com.ibatis.common.beans的功能,來完成系統中所有bean(領域層的類與表現層的類)get與set方法的測試,避免遺漏。
    DomainFixture.java類主要是構造兩個用于其他層進行測試的領域實體。
    2、? 持久層(persistence)
    持久層主要是測試訪問數據庫的代碼功能。主要可以分成三個類:PersistenceFixture、BasePersistenceTest和各種實際測試的類如:AccountDaoTest。
    PersistenceFixture類,這個類完成所有持久層代碼的數據庫的鏈接。
    BasePersistenceTest類,所有持久層類的父類,引用類PersistenceFixture,構造一個DaoManager的實例,用于取得各實際測試類的Dao。
    AccountDaoTest類,具體測試持久層的類,通過一下語句得到dao,然后進行測試。
    private AccountDao acctDao = (AccountDao)daoMgr.getDao(AccountDao.class);
    3、? 服務層(service)
    服務層由于需調用持久層來完成測試功能,所以,采用模擬對象(Mock Object)來完成。模擬對象的背后目的就是創建一個輕量級的、可控制的對象來代替測試中需要的真實對象,模擬真實對象的行為和功能,方便進行分層測試。JpetStore主要采用的是JMock。具體的介紹見(http://www.jetmaven.net/contents/documents/j_jMock_intro.php)?
    public?class?AccountServiceTest?extends?MockObjectTestCase?{?
    ??
    ??
    public?void?testShouldVerifyGetAccountIsCalledByUsername()?{?
    ????Mock?mock?
    =?mock(AccountDao.class);//創建模擬對象?
    ??
    ????
    //定義所要模擬的函數的具體信息?
    ????mock.expects(once())//模擬對象要執行的次數?
    ????????.method("getAccount")//模擬對象要執行的函數?
    ????????.with(NOT_NULL)//函數的入口參數?
    ????????.will(returnValue(new?Account()));//函數的返回參數?
    ??
    AccountService?accountService?
    =?new?AccountService((AccountDao)?mock.proxy());?
    //根據模擬對象的代理完成模擬對象與實際對象的關聯?
    ????accountService.getAccount("cbegin");?
    ??}
    ?
    }
    ?
    ?????? 上面是服務層AccountService的其中一個函數的測試代碼。所有使用JMock的類必須繼承于MockObjectTestCase。它的具體使用方法已經在備注中寫明。
    4、? 表現層(presentation)
    表現層和服務層的測試方法大致相同。首先通過模擬對象(mock object)模擬服務層,然后調用模擬對象完成實際的功能測試。下面是一個典型的bean的測試代碼?
    public?class?AccountBeanTest?extends?MockObjectTestCase?{?
    ??
    ??
    public?void?testShouldSuccessfullyCallServicesToCreateNewAccount()?{?
    ????Account?account?
    =?DomainFixture.newTestAccount();?
    ??
    ????Mock?accountServiceMock?
    =?mock(AccountService.class);?
    ??
    ????accountServiceMock.expects(once())?
    ????????.method(
    "insertAccount")?
    ????????.with(NOT_NULL);?
    ??
    ????accountServiceMock.expects(once())?
    ????????.method(
    "getAccount")?
    ????????.with(NOT_NULL)?
    ????????.will(returnValue(account));?
    ??
    ????Mock?catalogServiceMock?
    =?mock(CatalogService.class);?
    ??
    ????catalogServiceMock.expects(once())?
    ????????.method(
    "getProductListByCategory")?
    ????????.with(NOT_NULL)?
    ????????.will(returnValue(
    new?PaginatedArrayList(5)));?
    ??
    ????AccountBean?accountBean?
    =?new?AccountBean((AccountService)accountServiceMock.proxy(),?(CatalogService)catalogServiceMock.proxy());?
    ????accountBean.setAccount(account);?
    ??
    ????String?result?
    =?accountBean.newAccount();?
    ????assertEquals(AbstractBean.SUCCESS,?result);?
    ??}
    ?
    }
    ?
    ?
    通過學習JPetStoreShop的測試代碼,基本上可以學到這樣幾點
    1)? 測試代碼與實際代碼分離
    2)? 測試代碼與實際代碼的組成結構相同,易于查看
    3)? 測試代碼要分層進行
    4)? 領域層中的BeanTest.java類可以復用
    5)? 持久層的測試代碼類的關系可以學習
    6)? 服務層的Jmock中模擬對象(mock object)的使用方法
    ?
    本文只是簡單的對JpetStoreShop中的代碼進行了分析,包括測試代碼的組成以及基本關系,并未細化到測試代碼要測試哪些點。具體的測試點還需要參考其他書籍進行學習。關于Jmock的學習見http://www.jetmaven.net/contents/documents/j_jMock_intro.php
    關于測試的心得見http://m.tkk7.com/AndersLin/archive/2006/06/12/52298.html
    posted on 2007-01-22 15:18 滌生 閱讀(3334) 評論(0)  編輯  收藏

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


    網站導航:
     
    <2007年1月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    常用鏈接

    留言簿(5)

    隨筆檔案

    UML

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 伊人久久精品亚洲午夜| 亚洲av色香蕉一区二区三区| 一级人做人爰a全过程免费视频| 国产精品美女久久久免费| 久久国产乱子伦精品免费看| 中文字幕无码视频手机免费看 | h视频在线观看免费| 亚洲Av无码乱码在线观看性色 | 在线观看亚洲免费视频| 免费在线观看亚洲| 色播亚洲视频在线观看| 日本免费大黄在线观看| 免费看片A级毛片免费看| 久久无码av亚洲精品色午夜| 亚洲Av无码乱码在线znlu| 国产久爱免费精品视频| 亚洲av综合avav中文| 四虎成年永久免费网站| 亚洲久热无码av中文字幕| 免费又黄又爽又猛的毛片| 国精产品一区一区三区免费视频| 亚洲精品成人av在线| 西西大胆无码视频免费| 国产成人亚洲精品播放器下载| 国产精品亚洲不卡一区二区三区| 亚洲妇女无套内射精| 亚洲国产精品成人久久蜜臀| 国产精品免费大片| 亚洲熟女精品中文字幕| 亚洲综合免费视频| 性色av极品无码专区亚洲| 国产午夜亚洲不卡| 美女被免费喷白浆视频| 免费的黄网站男人的天堂| 日本免费观看网站| 亚洲欧美日韩中文高清www777 | 男女免费观看在线爽爽爽视频| 久久精品国产亚洲av天美18| 最近中文字幕无免费视频| 亚洲高清有码中文字| 99热在线精品免费全部my|