posts - 11,  comments - 28,  trackbacks - 0

          JpetStore提供了一個整套的測試代碼對于想進行單元測試卻不知道如何進行單元測試的人(me)來說,是一個很好的學習機會。
          JpetStore的單元測試代碼與它的系統(tǒng)源文件是獨立分離的,在test文件夾中。打開文件夾可以很清楚的發(fā)現(xiàn)該文件夾的內容組成結構與源文件基本一致。
          JpetStore分為領域層(domain),持久層(peristence),服務層(service),表現(xiàn)層(presentation),它的測試也分這幾個層來進行。下面就按層來學習它的test。
          1、? 領域層(domain)
          由于領域層的代碼主要是用于在各層之間傳遞的類,所以,此層的測試代碼也比較簡單,主要有兩個測試類,BeanTest.java與DomainFixture.java。
          BeanTest.java類主要是利用包com.ibatis.common.beans的功能,來完成系統(tǒng)中所有bean(領域層的類與表現(xiàn)層的類)get與set方法的測試,避免遺漏。
          DomainFixture.java類主要是構造兩個用于其他層進行測試的領域實體。
          2、? 持久層(persistence)
          持久層主要是測試訪問數(shù)據庫的代碼功能。主要可以分成三個類:PersistenceFixture、BasePersistenceTest和各種實際測試的類如:AccountDaoTest。
          PersistenceFixture類,這個類完成所有持久層代碼的數(shù)據庫的鏈接。
          BasePersistenceTest類,所有持久層類的父類,引用類PersistenceFixture,構造一個DaoManager的實例,用于取得各實際測試類的Dao。
          AccountDaoTest類,具體測試持久層的類,通過一下語句得到dao,然后進行測試。
          private AccountDao acctDao = (AccountDao)daoMgr.getDao(AccountDao.class);
          3、? 服務層(service)
          服務層由于需調用持久層來完成測試功能,所以,采用模擬對象(Mock Object)來完成。模擬對象的背后目的就是創(chuàng)建一個輕量級的、可控制的對象來代替測試中需要的真實對象,模擬真實對象的行為和功能,方便進行分層測試。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);//創(chuàng)建模擬對象?
          ??
          ????
          //定義所要模擬的函數(shù)的具體信息?
          ????mock.expects(once())//模擬對象要執(zhí)行的次數(shù)?
          ????????.method("getAccount")//模擬對象要執(zhí)行的函數(shù)?
          ????????.with(NOT_NULL)//函數(shù)的入口參數(shù)?
          ????????.will(returnValue(new?Account()));//函數(shù)的返回參數(shù)?
          ??
          AccountService?accountService?
          =?new?AccountService((AccountDao)?mock.proxy());?
          //根據模擬對象的代理完成模擬對象與實際對象的關聯(lián)?
          ????accountService.getAccount("cbegin");?
          ??}
          ?
          }
          ?
          ?????? 上面是服務層AccountService的其中一個函數(shù)的測試代碼。所有使用JMock的類必須繼承于MockObjectTestCase。它的具體使用方法已經在備注中寫明。
          4、? 表現(xiàn)層(presentation)
          表現(xiàn)層和服務層的測試方法大致相同。首先通過模擬對象(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://www.aygfsteel.com/AndersLin/archive/2006/06/12/52298.html
          posted on 2007-01-22 15:18 滌生 閱讀(3336) 評論(0)  編輯  收藏

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


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

          常用鏈接

          留言簿(5)

          隨筆檔案

          UML

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 九江县| 灵武市| 崇州市| 西盟| 涿鹿县| 宁德市| 平舆县| 垫江县| 修武县| 太仆寺旗| 仲巴县| 新化县| 太湖县| 宜宾县| 永修县| 呈贡县| 海淀区| 柳州市| 靖边县| 肇源县| 靖西县| 长顺县| 石嘴山市| 汤原县| 天台县| 亳州市| 阳西县| 安顺市| 吉首市| 江安县| 唐河县| 蕲春县| 滁州市| 新巴尔虎左旗| 许昌市| 汤原县| 富源县| 肇源县| 丹凤县| 长兴县| 循化|