2007-05-17
倒底该怎么写DAO的单元测试?
public void testAddUserInfo() throws Exception{
userInfo = new UserInfoDTO();
userInfo.setUserId("001");
userInfo.setUserName("张三");
userInfoDao.addUserInfo(userInfo);
this.assertNotNull(userInfoDao.getUserInfo(userInfo.getUserId()));
this.assertEquals(userInfo.getUserId(), userInfoDao.getUserInfo(userInfo.getUserId()).getUserId());
userInfoDao.removeUser(userInfo.getUserId()); }
为了避免脏数据!!!所以要把新插入的数据用removeUser删除掉!!!
当然,如果使用Spring的那个带有事务的基类。在TearDown时,会回滚所有事务。removeUser这个方法可以无需要。不会产生因单元测试的脏数据
困惑多一:
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
根据单元测试的原则!!!
1.测试方法不应该有先后顺序!!
2.测试方法不应该依赖于另一个方法!
你上面的例子,我们需要测试的仅仅是addUserInfo这个方法!!
假设addUserInfo方法实际上是没有任何问题的,如果getUserInfo方法不正常。的确影响了这个测试结果!!!
大家平时是怎么写dao测试方法的?
评论
jerry_shen
2007-07-13
我觉得应该准备一个测试用的标准库。
JaneJiao
2007-07-12
klyuan 写道
我是说,各个测试方法之间有依赖
各个测试方法之间最好不要有依赖, 所有的测试方法都是独立的!
xianglg
2007-07-12
最好能分出测试机和生产机,那就不存在要删除测试数据
deeravenger
2007-07-11
把dao测试代码裹在一个事务里面,测试完成之后rollback.
这样既不会出现脏数据,也能够在测试当中测试所需要的动作并看到所作的变化。
===========================
同意这个,但是为什么大家都不太关注呢?
这样既不会出现脏数据,也能够在测试当中测试所需要的动作并看到所作的变化。
===========================
同意这个,但是为什么大家都不太关注呢?
sword721
2007-07-10
哈哈,dao层不写单元测试最好。节省成本。
realreal2000
2007-07-10
我们的单元测试是这样写的
初始化配置资源文件
/**类工厂
* @generated
*/
初始化配置资源文件
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
public class SpringMockBasicDaoHibernateTestCase extends
AbstractTransactionalDataSourceSpringContextTests{
protected String[] getConfigLocations() {
return new String[]{"applicationContext-resources.xml","applicationContext-hibernate.xml"};
}
}
/**类工厂
* @generated
*/
import java.util.Date;
public class ModelBasicFactory {
/**
* @generated
public static TsyscodeCard createTsyscodeCard(){
TsyscodeCard tsyscodeCard = new TsyscodeCard();
tsyscodeCard.setCid(3);
tsyscodeCard.setDescription("testString");
tsyscodeCard.setCodename("testString");
tsyscodeCard.setCodeid("testString");
return tsyscodeCard;
}
public static TsyscodeCard[] createTsyscodeCards(int size){
TsyscodeCard[] tsyscodeCards = new TsyscodeCard[size];
for(int i=0;i<size;i++){
tsyscodeCards[i] = new TsyscodeCard();
tsyscodeCards[i].setCid(3);
tsyscodeCards[i].setDescription("testString");
tsyscodeCards[i].setCodename("testString");
tsyscodeCards[i].setCodeid("testString");
}
return tsyscodeCards;
}
}
baallee
2007-07-10
一个test方法测试整个dao的crud.
最好能有专门的测试数据库
没有的话,
就从create一条纪录开始,retrieve出来assert刚刚插入的数据,
再讲retrieve出的数据update到数据库。再retrieve出来assert刚刚update的数据,最后delete。在去retrieve,看看是不是0条。
这样保证了数据的完成性。
最好能有专门的测试数据库
没有的话,
就从create一条纪录开始,retrieve出来assert刚刚插入的数据,
再讲retrieve出的数据update到数据库。再retrieve出来assert刚刚update的数据,最后delete。在去retrieve,看看是不是0条。
这样保证了数据的完成性。
lovevirus
2007-07-10
xly_971223 写道
klyuan 写道
xly_971223 写道
困惑多一: 新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
UserDao.createUser(user); assertNotNull(user.getId());
这样就行了 为什么要用getUserInfo()
用要是用hibernate这样就可以了!!!
如果我插入一条数据,并没有返回id呢?
如果没有返回值 测试起来可能要复杂了 只能通过计算总条数了
个人认为要测试Dao 必须每人一个数据库 这是前提 有了这个前提测试就方便了 因为数据库里有什么数据自己都知道
但是必须要保持数据库每次初始化时的数据都是一致的
如果每个人都自己的数据库,知道自己的需要的数据,那怎么做构建时的自动测试。
UserDao.createUser(user); assertNotNull(user.getId());
用的是基于状态测试,当然需要对最终状态进行测试,所以getUserInfo()是有必要,如果说怕getUserInfo有问题,说明你需要考虑一下你的代码是否可测试
badqiu
2007-05-22
不写!!
xly_971223
2007-05-22
klyuan 写道
xly_971223 写道
困惑多一: 新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
UserDao.createUser(user); assertNotNull(user.getId());
这样就行了 为什么要用getUserInfo()
用要是用hibernate这样就可以了!!!
如果我插入一条数据,并没有返回id呢?
如果没有返回值 测试起来可能要复杂了 只能通过计算总条数了
个人认为要测试Dao 必须每人一个数据库 这是前提 有了这个前提测试就方便了 因为数据库里有什么数据自己都知道
但是必须要保持数据库每次初始化时的数据都是一致的
klyuan
2007-05-22
xly_971223 写道
困惑多一: 新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!
UserDao.createUser(user); assertNotNull(user.getId());
这样就行了 为什么要用getUserInfo()
用要是用hibernate这样就可以了!!!
如果我插入一条数据,并没有返回id呢?
klyuan
2007-05-22
xly_971223 写道
wuhua 写道
想怎么写就怎么写吧,
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面
只要保证每人一个数据库就行
这个会产生问题的,你这次能测试通过的!下次就可能通不过了!!!不适合做自动批量测试
klyuan
2007-05-22
dengyin2000 写道
结合dbunit 和 spring的那个测试基类。 dbunit为你准备好数据。 数据是定义在xml文件中的
如果是多表的,或者有些数据库特性的!
比如sequence!!!这个就不好用了吧!
jncz
2007-05-21
dbunit貌似有个问题,导致比较的难用,比如 有些实体 是自关联的,那么dbunit就无法在tearDown的时候删除数据,因为它无法发现依赖的方向
抛出异常的爱
2007-05-21
wuhua 写道
想怎么写就怎么写吧,
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面
真的可能么。。。。
xly_971223
2007-05-21
wuhua 写道
想怎么写就怎么写吧,
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面
只要保证每人一个数据库就行
wuhua
2007-05-21
想怎么写就怎么写吧,
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面
liangguanhui
2007-05-21
貌似可以使用DBUnit,不过我没用过
抛出异常的爱
2007-05-19
主要是业务没分层太复杂 了
charon
2007-05-18
把dao测试代码裹在一个事务里面,测试完成之后rollback.
这样既不会出现脏数据,也能够在测试当中测试所需要的动作并看到所作的变化。
好像很早以前就讨论过这个方法。
当然,最好的办法还是使用单独的数据库。但是即使在这种情形下,前面的办法也很有用。
这样既不会出现脏数据,也能够在测试当中测试所需要的动作并看到所作的变化。
好像很早以前就讨论过这个方法。
当然,最好的办法还是使用单独的数据库。但是即使在这种情形下,前面的办法也很有用。
- 浏览: 92673 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
详解spring事务属性
不错 不错 说的很清楚!
-- by evil850209 -
ThreadLocal与synchroniz ...
klyuan 写道ThreadLocal与synchronized Synchr ...
-- by bruce.lu -
ThreadLocal与synchroniz ...
http://www.javaeye.com/post/504793 这篇帖子非 ...
-- by jieyuan_cg -
ThreadLocal与synchroniz ...
是不是可以这样理解,ThreadLocal的作用是为了不采用全局变量来解决也可以 ...
-- by jieyuan_cg -
ThreadLocal与synchroniz ...
前一个回帖被评为灌水回复贴。 现在,偶也聊两句非灌水的: ThreadLoca ...
-- by realorg






评论排行榜