涤生的天空
BlogJava
首页
新随笔
新文章
联系
聚合
管理
posts - 11, comments - 23, 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://www.blogjava.net/AndersLin/archive/2006/06/12/52298.html
posted on 2007-01-22 15:18
涤生
阅读(2468)
评论(0)
编辑
收藏
IT新闻
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
<
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
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔档案
2007年1月 (11)
UML
类与类关系的UML图与代码表现
描述的简单、清楚
搜索
最新评论
1. re: ibatis JshopStore5的sqlmap的xml错误,NestedSQLException错误
我也是这样改的,不过仍然还是错误。。。搞不明白呢。
--Guest
2. re: ibaits的JPetStore中持久层的研究、事务的处理
非常不错
--xuxiaolei
3. re: IBatis的分页研究
性能是个大问题
--汽车
4. re: ibaits的JPetStore中持久层的研究、事务的处理
好 VERY GOOD
--王天奇
5. re: 如何在Eclipse中运行ibatis的JpetStore[未登录]
@11
IncludeBottom.jsp文件不是完整的网页文件,是用来被其它jsp文件include的,结合IncludeTop.jsp看就不会有错了。
--alex
阅读排行榜
1. 根据iBatis的JPetStore学习测试示例的写法(2468)
2. IBatis的分页研究(2195)
3. iBatis的JpetStore示例中MVC机制实现的研究,BeanAction,BaseBean(2116)
4. ibaits的JPetStore中持久层的研究、事务的处理(1860)
5. 如何在Eclipse中运行ibatis的JpetStore(1259)
评论排行榜
1. iBatis的JpetStore示例中MVC机制实现的研究,BeanAction,BaseBean(8)
2. IBatis的分页研究(6)
3. ibatis JshopStore5的sqlmap的xml错误,NestedSQLException错误(4)
4. 如何在Eclipse中运行ibatis的JpetStore(3)
5. ibaits的JPetStore中持久层的研究、事务的处理(2)