滌生的天空
BlogJava
首頁
新隨筆
新文章
聯(lián)系
聚合
管理
posts - 11, comments - 28, trackbacks - 0
根據(jù)iBatis的JPetStore學習測試示例的寫法
JpetStore提供了一個整套的測試代碼對于想進行單元測試卻不知道如何進行單元測試的人(me)來說,是一個很好的學習機會。
JpetStore的單元測試代碼與它的系統(tǒng)源文件是獨立分離的,在test文件夾中。打開文件夾可以很清楚的發(fā)現(xiàn)該文件夾的內(nèi)容組成結(jié)構(gòu)與源文件基本一致。
JpetStore分為領(lǐng)域?qū)樱╠omain),持久層(peristence),服務(wù)層(service),表現(xiàn)層(presentation),它的測試也分這幾個層來進行。下面就按層來學習它的test。
1、? 領(lǐng)域?qū)樱╠omain)
由于領(lǐng)域?qū)拥拇a主要是用于在各層之間傳遞的類,所以,此層的測試代碼也比較簡單,主要有兩個測試類,BeanTest.java與DomainFixture.java。
BeanTest.java類主要是利用包com.ibatis.common.beans的功能,來完成系統(tǒng)中所有bean(領(lǐng)域?qū)拥念惻c表現(xiàn)層的類)get與set方法的測試,避免遺漏。
DomainFixture.java類主要是構(gòu)造兩個用于其他層進行測試的領(lǐng)域?qū)嶓w。
2、? 持久層(persistence)
持久層主要是測試訪問數(shù)據(jù)庫的代碼功能。主要可以分成三個類:PersistenceFixture、BasePersistenceTest和各種實際測試的類如:AccountDaoTest。
PersistenceFixture類,這個類完成所有持久層代碼的數(shù)據(jù)庫的鏈接。
BasePersistenceTest類,所有持久層類的父類,引用類PersistenceFixture,構(gòu)造一個DaoManager的實例,用于取得各實際測試類的Dao。
AccountDaoTest類,具體測試持久層的類,通過一下語句得到dao,然后進行測試。
private AccountDao acctDao = (AccountDao)daoMgr.getDao(AccountDao.class);
3、? 服務(wù)層(service)
服務(wù)層由于需調(diào)用持久層來完成測試功能,所以,采用模擬對象(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());?
//
根據(jù)模擬對象的代理完成模擬對象與實際對象的關(guān)聯(lián)?
????accountService.getAccount(
"
cbegin
"
);?
??}
?
}
?
?????? 上面是服務(wù)層AccountService的其中一個函數(shù)的測試代碼。所有使用JMock的類必須繼承于MockObjectTestCase。它的具體使用方法已經(jīng)在備注中寫明。
4、? 表現(xiàn)層(presentation)
表現(xiàn)層和服務(wù)層的測試方法大致相同。首先通過模擬對象(mock object)模擬服務(wù)層,然后調(diào)用模擬對象完成實際的功能測試。下面是一個典型的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)? 測試代碼與實際代碼的組成結(jié)構(gòu)相同,易于查看
3)? 測試代碼要分層進行
4)? 領(lǐng)域?qū)又械腂eanTest.java類可以復(fù)用
5)? 持久層的測試代碼類的關(guān)系可以學習
6)? 服務(wù)層的Jmock中模擬對象(mock object)的使用方法
?
本文只是簡單的對JpetStoreShop中的代碼進行了分析,包括測試代碼的組成以及基本關(guān)系,并未細化到測試代碼要測試哪些點。具體的測試點還需要參考其他書籍進行學習。關(guān)于Jmock的學習見http://www.jetmaven.net/contents/documents/j_jMock_intro.php
關(guān)于測試的心得見http://m.tkk7.com/AndersLin/archive/2006/06/12/52298.html
posted on 2007-01-22 15:18
滌生
閱讀(3334)
評論(0)
編輯
收藏
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(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
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(5)
給我留言
查看公開留言
查看私人留言
隨筆檔案
2007年1月 (11)
UML
類與類關(guān)系的UML圖與代碼表現(xiàn)
描述的簡單、清楚
搜索
最新評論
1.?re: ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤
@junmy
你走得路,先人已經(jīng)走過N多次了.
你再走來,不覺得可恥嗎?
--LingShame
2.?re: ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤
好內(nèi)容,以前研究過,不過好久了, 最近寫了幾句,也發(fā)現(xiàn)了這個問題
--ossoftwaare
3.?re: 如何在Eclipse中運行ibatis的JpetStore
寫的不錯,看了作者的描述,已經(jīng)把問題解決了,謝謝。
--dashen
4.?re: 如何在Eclipse中運行ibatis訪問MsSqlServer
好,正需要,回去試試先.謝謝了
--一個人
5.?re: 如何在Eclipse中使用ibatis的自動代碼生成工具Abator
iBatis
大全~
--墻頭草
閱讀排行榜
1.?IBatis的分頁研究(8460)
2.?如何在Eclipse中運行ibatis的JpetStore(4281)
3.?iBatis的JpetStore示例中MVC機制實現(xiàn)的研究,BeanAction,BaseBean(3884)
4.?ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤(3365)
5.? 根據(jù)iBatis的JPetStore學習測試示例的寫法(3334)
評論排行榜
1.?iBatis的JpetStore示例中MVC機制實現(xiàn)的研究,BeanAction,BaseBean(8)
2.?ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤(6)
3.?IBatis的分頁研究(6)
4.?如何在Eclipse中運行ibatis的JpetStore(4)
5.?ibaits的JPetStore中持久層的研究、事務(wù)的處理(2)
主站蜘蛛池模板:
亚洲色精品vr一区二区三区
|
在线免费观看你懂的
|
免费高清在线爱做视频
|
亚洲国产精品成人久久久
|
亚洲JLZZJLZZ少妇
|
最近免费中文字幕4
|
亚洲一区电影在线观看
|
无码国产精品久久一区免费
|
亚洲一级免费毛片
|
黄网址在线永久免费观看
|
亚洲精品无码久久久久APP
|
一级做a爰片久久免费
|
亚洲午夜精品一级在线播放放
|
成人久久久观看免费毛片
|
亚洲成av人片一区二区三区
|
成人在线免费视频
|
亚洲av日韩av高潮潮喷无码
|
免费观看无遮挡www的视频
|
久久亚洲精品国产精品婷婷
|
暖暖日本免费在线视频
|
成人精品综合免费视频
|
亚洲精品国产成人专区
|
成人毛片18女人毛片免费视频未
|
爱爱帝国亚洲一区二区三区
|
久久亚洲av无码精品浪潮
|
亚洲免费在线播放
|
国产精品亚洲综合久久
|
爱情岛论坛网亚洲品质自拍
|
免费A级毛片无码专区
|
亚洲乱理伦片在线观看中字
|
亚洲精品无码99在线观看
|
人妻无码一区二区三区免费
|
亚洲中文字幕无码久久
|
久久亚洲精品无码观看不卡
|
57pao国产成永久免费视频
|
色偷偷尼玛图亚洲综合
|
久久久亚洲精品视频
|
免费的一级黄色片
|
久久国产精品成人免费
|
亚洲经典千人经典日产
|
亚洲国产精品嫩草影院在线观看
|