滌生的天空
BlogJava
首頁(yè)
新隨筆
新文章
聯(lián)系
聚合
管理
posts - 11, comments - 28, trackbacks - 0
根據(jù)iBatis的JPetStore學(xué)習(xí)測(cè)試示例的寫法
JpetStore提供了一個(gè)整套的測(cè)試代碼對(duì)于想進(jìn)行單元測(cè)試卻不知道如何進(jìn)行單元測(cè)試的人(me)來說,是一個(gè)很好的學(xué)習(xí)機(jī)會(huì)。
JpetStore的單元測(cè)試代碼與它的系統(tǒng)源文件是獨(dú)立分離的,在test文件夾中。打開文件夾可以很清楚的發(fā)現(xiàn)該文件夾的內(nèi)容組成結(jié)構(gòu)與源文件基本一致。
JpetStore分為領(lǐng)域?qū)樱╠omain),持久層(peristence),服務(wù)層(service),表現(xiàn)層(presentation),它的測(cè)試也分這幾個(gè)層來進(jìn)行。下面就按層來學(xué)習(xí)它的test。
1、? 領(lǐng)域?qū)樱╠omain)
由于領(lǐng)域?qū)拥拇a主要是用于在各層之間傳遞的類,所以,此層的測(cè)試代碼也比較簡(jiǎn)單,主要有兩個(gè)測(cè)試類,BeanTest.java與DomainFixture.java。
BeanTest.java類主要是利用包c(diǎn)om.ibatis.common.beans的功能,來完成系統(tǒng)中所有bean(領(lǐng)域?qū)拥念惻c表現(xiàn)層的類)get與set方法的測(cè)試,避免遺漏。
DomainFixture.java類主要是構(gòu)造兩個(gè)用于其他層進(jìn)行測(cè)試的領(lǐng)域?qū)嶓w。
2、? 持久層(persistence)
持久層主要是測(cè)試訪問數(shù)據(jù)庫(kù)的代碼功能。主要可以分成三個(gè)類:PersistenceFixture、BasePersistenceTest和各種實(shí)際測(cè)試的類如:AccountDaoTest。
PersistenceFixture類,這個(gè)類完成所有持久層代碼的數(shù)據(jù)庫(kù)的鏈接。
BasePersistenceTest類,所有持久層類的父類,引用類PersistenceFixture,構(gòu)造一個(gè)DaoManager的實(shí)例,用于取得各實(shí)際測(cè)試類的Dao。
AccountDaoTest類,具體測(cè)試持久層的類,通過一下語句得到dao,然后進(jìn)行測(cè)試。
private AccountDao acctDao = (AccountDao)daoMgr.getDao(AccountDao.class);
3、? 服務(wù)層(service)
服務(wù)層由于需調(diào)用持久層來完成測(cè)試功能,所以,采用模擬對(duì)象(Mock Object)來完成。模擬對(duì)象的背后目的就是創(chuàng)建一個(gè)輕量級(jí)的、可控制的對(duì)象來代替測(cè)試中需要的真實(shí)對(duì)象,模擬真實(shí)對(duì)象的行為和功能,方便進(jìn)行分層測(cè)試。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)建模擬對(duì)象?
??
????
//
定義所要模擬的函數(shù)的具體信息?
????mock.expects(once())
//
模擬對(duì)象要執(zhí)行的次數(shù)?
????????.method(
"
getAccount
"
)
//
模擬對(duì)象要執(zhí)行的函數(shù)?
????????.with(NOT_NULL)
//
函數(shù)的入口參數(shù)?
????????.will(returnValue(
new
?Account()));
//
函數(shù)的返回參數(shù)?
??
AccountService?accountService?
=
?
new
?AccountService((AccountDao)?mock.proxy());?
//
根據(jù)模擬對(duì)象的代理完成模擬對(duì)象與實(shí)際對(duì)象的關(guān)聯(lián)?
????accountService.getAccount(
"
cbegin
"
);?
??}
?
}
?
?????? 上面是服務(wù)層AccountService的其中一個(gè)函數(shù)的測(cè)試代碼。所有使用JMock的類必須繼承于MockObjectTestCase。它的具體使用方法已經(jīng)在備注中寫明。
4、? 表現(xiàn)層(presentation)
表現(xiàn)層和服務(wù)層的測(cè)試方法大致相同。首先通過模擬對(duì)象(mock object)模擬服務(wù)層,然后調(diào)用模擬對(duì)象完成實(shí)際的功能測(cè)試。下面是一個(gè)典型的bean的測(cè)試代碼?
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);?
??}
?
}
?
?
通過學(xué)習(xí)JPetStoreShop的測(cè)試代碼,基本上可以學(xué)到這樣幾點(diǎn)
1)? 測(cè)試代碼與實(shí)際代碼分離
2)? 測(cè)試代碼與實(shí)際代碼的組成結(jié)構(gòu)相同,易于查看
3)? 測(cè)試代碼要分層進(jìn)行
4)? 領(lǐng)域?qū)又械腂eanTest.java類可以復(fù)用
5)? 持久層的測(cè)試代碼類的關(guān)系可以學(xué)習(xí)
6)? 服務(wù)層的Jmock中模擬對(duì)象(mock object)的使用方法
?
本文只是簡(jiǎn)單的對(duì)JpetStoreShop中的代碼進(jìn)行了分析,包括測(cè)試代碼的組成以及基本關(guān)系,并未細(xì)化到測(cè)試代碼要測(cè)試哪些點(diǎn)。具體的測(cè)試點(diǎn)還需要參考其他書籍進(jìn)行學(xué)習(xí)。關(guān)于Jmock的學(xué)習(xí)見http://www.jetmaven.net/contents/documents/j_jMock_intro.php
關(guān)于測(cè)試的心得見http://m.tkk7.com/AndersLin/archive/2006/06/12/52298.html
posted on 2007-01-22 15:18
滌生
閱讀(3369)
評(píng)論(0)
編輯
收藏
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
Copyright ©2025 滌生 Powered by:
博客園
模板提供:
滬江博客
<
2007年1月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(5)
給我留言
查看公開留言
查看私人留言
隨筆檔案
2007年1月 (11)
UML
類與類關(guān)系的UML圖與代碼表現(xiàn)
描述的簡(jiǎn)單、清楚
搜索
最新評(píng)論
1.?re: ibatis JshopStore5的sqlmap的xml錯(cuò)誤,NestedSQLException錯(cuò)誤
@junmy
你走得路,先人已經(jīng)走過N多次了.
你再走來,不覺得可恥嗎?
--LingShame
2.?re: ibatis JshopStore5的sqlmap的xml錯(cuò)誤,NestedSQLException錯(cuò)誤
好內(nèi)容,以前研究過,不過好久了, 最近寫了幾句,也發(fā)現(xiàn)了這個(gè)問題
--ossoftwaare
3.?re: 如何在Eclipse中運(yùn)行ibatis的JpetStore
寫的不錯(cuò),看了作者的描述,已經(jīng)把問題解決了,謝謝。
--dashen
4.?re: 如何在Eclipse中運(yùn)行ibatis訪問MsSqlServer
好,正需要,回去試試先.謝謝了
--一個(gè)人
5.?re: 如何在Eclipse中使用ibatis的自動(dòng)代碼生成工具Abator
iBatis
大全~
--墻頭草
閱讀排行榜
1.?IBatis的分頁(yè)研究(8467)
2.?如何在Eclipse中運(yùn)行ibatis的JpetStore(4291)
3.?iBatis的JpetStore示例中MVC機(jī)制實(shí)現(xiàn)的研究,BeanAction,BaseBean(3894)
4.?ibatis JshopStore5的sqlmap的xml錯(cuò)誤,NestedSQLException錯(cuò)誤(3373)
5.? 根據(jù)iBatis的JPetStore學(xué)習(xí)測(cè)試示例的寫法(3369)
評(píng)論排行榜
1.?iBatis的JpetStore示例中MVC機(jī)制實(shí)現(xiàn)的研究,BeanAction,BaseBean(8)
2.?ibatis JshopStore5的sqlmap的xml錯(cuò)誤,NestedSQLException錯(cuò)誤(6)
3.?IBatis的分頁(yè)研究(6)
4.?如何在Eclipse中運(yùn)行ibatis的JpetStore(4)
5.?ibaits的JPetStore中持久層的研究、事務(wù)的處理(2)
主站蜘蛛池模板:
国产成人亚洲午夜电影
|
亚洲综合精品一二三区在线
|
亚洲一区二区三区在线观看蜜桃
|
中文精品人人永久免费
|
在线播放高清国语自产拍免费
|
毛片免费全部免费观看
|
91天堂素人精品系列全集亚洲
|
国产精品亚洲综合天堂夜夜
|
在线观看成人免费
|
亚洲国产精品成人AV在线
|
成熟女人特级毛片www免费
|
亚洲熟女精品中文字幕
|
免费观看的毛片手机视频
|
色偷偷亚洲第一综合
|
国产99视频精品免费视频7
|
国产AV日韩A∨亚洲AV电影
|
亚洲国产综合精品一区在线播放
|
美女黄色毛片免费看
|
亚洲日本va午夜中文字幕久久
|
国产成人亚洲毛片
|
久久久久亚洲精品无码网址
|
又黄又大的激情视频在线观看免费视频社区在线
|
亚洲香蕉久久一区二区
|
午夜两性色视频免费网站
|
亚洲Av永久无码精品黑人
|
亚洲精品国产精品乱码不卞
|
你懂的在线免费观看
|
亚洲avav天堂av在线不卡
|
亚洲AV无码成人精品区狼人影院
|
国产成人精品免费视频软件
|
五月天国产成人AV免费观看
|
亚洲成人在线网站
|
成人免费看片又大又黄
|
国产免费久久精品99久久
|
亚洲精品91在线
|
国产日产成人免费视频在线观看
|
国产日韩精品无码区免费专区国产
|
666精品国产精品亚洲
|
国产中文字幕免费
|
97青青草原国产免费观看
|
亚洲制服丝袜中文字幕
|