滌生的天空
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 11, comments - 28, trackbacks - 0
根據iBatis的JPetStore學習測試示例的寫法
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)
編輯
收藏
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
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
類與類關系的UML圖與代碼表現
描述的簡單、清楚
搜索
最新評論
1.?re: ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤
@junmy
你走得路,先人已經走過N多次了.
你再走來,不覺得可恥嗎?
--LingShame
2.?re: ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤
好內容,以前研究過,不過好久了, 最近寫了幾句,也發現了這個問題
--ossoftwaare
3.?re: 如何在Eclipse中運行ibatis的JpetStore
寫的不錯,看了作者的描述,已經把問題解決了,謝謝。
--dashen
4.?re: 如何在Eclipse中運行ibatis訪問MsSqlServer
好,正需要,回去試試先.謝謝了
--一個人
5.?re: 如何在Eclipse中使用ibatis的自動代碼生成工具Abator
iBatis
大全~
--墻頭草
閱讀排行榜
1.?IBatis的分頁研究(8460)
2.?如何在Eclipse中運行ibatis的JpetStore(4280)
3.?iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean(3884)
4.?ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤(3365)
5.? 根據iBatis的JPetStore學習測試示例的寫法(3334)
評論排行榜
1.?iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean(8)
2.?ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤(6)
3.?IBatis的分頁研究(6)
4.?如何在Eclipse中運行ibatis的JpetStore(4)
5.?ibaits的JPetStore中持久層的研究、事務的處理(2)
主站蜘蛛池模板:
伊人久久精品亚洲午夜
|
亚洲av色香蕉一区二区三区
|
一级人做人爰a全过程免费视频
|
国产精品美女久久久免费
|
久久国产乱子伦精品免费看
|
中文字幕无码视频手机免费看
|
h视频在线观看免费
|
亚洲Av无码乱码在线观看性色
|
在线观看亚洲免费视频
|
免费在线观看亚洲
|
色播亚洲视频在线观看
|
日本免费大黄在线观看
|
免费看片A级毛片免费看
|
久久无码av亚洲精品色午夜
|
亚洲Av无码乱码在线znlu
|
国产久爱免费精品视频
|
亚洲av综合avav中文
|
四虎成年永久免费网站
|
亚洲久热无码av中文字幕
|
免费又黄又爽又猛的毛片
|
国精产品一区一区三区免费视频
|
亚洲精品成人av在线
|
西西大胆无码视频免费
|
国产成人亚洲精品播放器下载
|
国产精品亚洲不卡一区二区三区
|
亚洲妇女无套内射精
|
亚洲国产精品成人久久蜜臀
|
国产精品免费大片
|
亚洲熟女精品中文字幕
|
亚洲综合免费视频
|
性色av极品无码专区亚洲
|
国产午夜亚洲不卡
|
美女被免费喷白浆视频
|
免费的黄网站男人的天堂
|
日本免费观看网站
|
亚洲欧美日韩中文高清www777
|
男女免费观看在线爽爽爽视频
|
久久精品国产亚洲av天美18
|
最近中文字幕无免费视频
|
亚洲高清有码中文字
|
99热在线精品免费全部my
|