`
klyuan
  • 浏览: 182166 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

倒底该怎么写DAO的单元测试?

    博客分类:
  • java
阅读更多
	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测试方法的?
分享到:
评论
45 楼 jerry_shen 2007-07-13  
我觉得应该准备一个测试用的标准库。
44 楼 JaneJiao 2007-07-12  
klyuan 写道

我是说,各个测试方法之间有依赖





各个测试方法之间最好不要有依赖, 所有的测试方法都是独立的!
43 楼 xianglg 2007-07-12  
最好能分出测试机和生产机,那就不存在要删除测试数据
42 楼 deeravenger 2007-07-11  
把dao测试代码裹在一个事务里面,测试完成之后rollback.
这样既不会出现脏数据,也能够在测试当中测试所需要的动作并看到所作的变化。
===========================
同意这个,但是为什么大家都不太关注呢?
41 楼 sword721 2007-07-10  
哈哈,dao层不写单元测试最好。节省成本。
40 楼 realreal2000 2007-07-10  
我们的单元测试是这样写的

初始化配置资源文件
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;
}
}


39 楼 baallee 2007-07-10  
一个test方法测试整个dao的crud.
最好能有专门的测试数据库
没有的话,
就从create一条纪录开始,retrieve出来assert刚刚插入的数据,
再讲retrieve出的数据update到数据库。再retrieve出来assert刚刚update的数据,最后delete。在去retrieve,看看是不是0条。
这样保证了数据的完成性。

38 楼 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有问题,说明你需要考虑一下你的代码是否可测试

37 楼 badqiu 2007-05-22  
不写!!
36 楼 xly_971223 2007-05-22  
klyuan 写道
xly_971223 写道
困惑多一: 
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!

UserDao.createUser(user);
assertNotNull(user.getId());

这样就行了 为什么要用getUserInfo()


用要是用hibernate这样就可以了!!!
如果我插入一条数据,并没有返回id呢?

如果没有返回值 测试起来可能要复杂了 只能通过计算总条数了
个人认为要测试Dao 必须每人一个数据库 这是前提 有了这个前提测试就方便了 因为数据库里有什么数据自己都知道
但是必须要保持数据库每次初始化时的数据都是一致的
35 楼 klyuan 2007-05-22  
xly_971223 写道
困惑多一: 
新增一个用户后,需要调用一个方法getUserInfo来判断数据是否已经插入!!!

UserDao.createUser(user);
assertNotNull(user.getId());

这样就行了 为什么要用getUserInfo()


用要是用hibernate这样就可以了!!!
如果我插入一条数据,并没有返回id呢?
34 楼 klyuan 2007-05-22  
xly_971223 写道
wuhua 写道
想怎么写就怎么写吧,
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面

只要保证每人一个数据库就行


这个会产生问题的,你这次能测试通过的!下次就可能通不过了!!!不适合做自动批量测试
33 楼 klyuan 2007-05-22  
dengyin2000 写道
结合dbunit 和  spring的那个测试基类。  dbunit为你准备好数据。 数据是定义在xml文件中的


如果是多表的,或者有些数据库特性的!
比如sequence!!!这个就不好用了吧!
32 楼 jncz 2007-05-21  
dbunit貌似有个问题,导致比较的难用,比如 有些实体 是自关联的,那么dbunit就无法在tearDown的时候删除数据,因为它无法发现依赖的方向
31 楼 抛出异常的爱 2007-05-21  
wuhua 写道
想怎么写就怎么写吧,
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面

真的可能么。。。。
30 楼 xly_971223 2007-05-21  
wuhua 写道
想怎么写就怎么写吧,
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面

只要保证每人一个数据库就行
29 楼 wuhua 2007-05-21  
想怎么写就怎么写吧,
能做到没有软件没有bug就行
每个人的习惯不同,有些人喜欢mock,有的人喜欢准备一个简单的数据库(java内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面
28 楼 liangguanhui 2007-05-21  
貌似可以使用DBUnit,不过我没用过
27 楼 抛出异常的爱 2007-05-19  
主要是业务没分层太复杂 了
26 楼 charon 2007-05-18  
把dao测试代码裹在一个事务里面,测试完成之后rollback.
这样既不会出现脏数据,也能够在测试当中测试所需要的动作并看到所作的变化。
好像很早以前就讨论过这个方法。
当然,最好的办法还是使用单独的数据库。但是即使在这种情形下,前面的办法也很有用。

相关推荐

    SpringBoot 多模块Dao层单元测试

    IDEA Spring 多模块 Dao 层单元测试, 此代码只演示Dao层单元测试。。。。。。。。。。。。

    Android-KBUnitTest是一款轻量级DAO单元测试框架

    KBUnitTest是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。KBUnitTest支持原生SQLiteDatabase操作及GreenDAO、Afinal、XUtils、DbFlow第三方...

    自动测试所有dao单元测试

    NULL 博文链接:https://zhuliang1984723.iteye.com/blog/2260856

    JDBC相关单元测试及通用的Dao

    jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。

    mockito单元测试使用

    记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...

    DAO单元测试

    今天我将展示一下我是如何在实际中对dao进行单元测试的首先我们来确认一下dao需要什么样的环境,我的dao是用Spring+hibernate来构建的,而对应的数据源是oracle9。所以要进行dao的测试我需要从Spring的连接oracle的...

    对DAO编写单元测试[1]

    编写对DAO编写单元测试[1]软件测试单元测试作为保证软件质量及重构的基础,早已获得广大开发人员的认可。单元测试是一种细粒度的测试,越来越多的开发人员在提交功能模块时也同时提交相应的单元测试。对于大多数开发...

    对DAO编写单元测试源代码

    对DAO编写单元测试,其中的如下 package com.javaeedev.dao.impl; &lt;br&gt;import java.util.List; import java.util.UUID; &lt;br&gt;import com.javaeedev.dao.UserDao; import ...

    使用junit测试ssh中的dao

    NULL 博文链接:https://ruanjian-job-sina-cn.iteye.com/blog/1142032

    jmock-1.0.1-src.zip_单元测试

    都会需要对代码进行单元测试,对于关联依赖关系少或者比较简单的类来说,直接使用JUnit就可以轻松的完成测试工作,但是对于关联到其它比较复杂的类或对运行环境有要求的类的单元测试,比如ejb,servlet或Dao等,测试...

    对DAO编写单元测试[6]

    编写对DAO编写单元测试[6]下面是UserDaoImpl的单元测试类:publicclassUserDaoImplTestextendsDatabaseFixture{privateUserDaouserDao=newUserDaoImpl();privateUserDaoproxy=(UserDao)createProxy(userDao);@...

    DBUnit 进行单元测试

    一个很好的DBUnit的例子 博文链接:https://virgoooos.iteye.com/blog/186859

    数据库框架ormlite和单元测试框架junit的使用

    这是一个使用ormlite数据库框架进行数据库存储以及对数据库增删改查的操作,然后用单元测试框架junit对Dao类进行了测试的一个moudle。

    unit_test_db:DAO单元测试框架

    unit test db 这个框架仅限于数据库相关的单元测试。 功能 支持数据库datamap模式 使用 见单元测试 建数据库表结构,查看文件:prepare.sql 具体使用查看wiki:

    对DAO编写单元测试[4]

    编写对DAO编写单元测试[4]publicabstractclassTransactionCallback{publicfinalObjectexecute()throwsException{Transactiontx=HibernateUtil.getCurrentSession().beginTransaction();try{Objectr=doInTransaction...

    Android-YuiHatano——轻量级AndroidDAO单元测试框架

    YuiHatano是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。

    对DAO编写单元测试[3]

    编写对DAO编写单元测试[3]软件测试}UserDao接口定义了对用户的相关操作:publicinterfaceUserDao{UserqueryForSignOn(Stringusername);UserqueryUser(Stringusername);voidcreateUser(Useruser);voidupdateUser(User...

    对DAO编写单元测试[2]

    编写对DAO编写单元测试[2]软件测试privatelongcreatedDate;//创建时间privatelonglockDate;//锁定时间publicUser(){}publicUser(Stringusername,Stringpassword,booleanadmin,longlastSignOnDate){this.username=...

    单元测试资料

    单元测试资料,用easymock测试dao.txt

    对DAO编写单元测试[5]

    编写 对DAO编写单元测试[5] 软件测试 @Before//执行初始化脚本 publicvoidinitTables(){ for(Stringsql:initSqls){ executeSQL(sql); } } staticConnectiongetConnection()throwsSQLException{ ...

Global site tag (gtag.js) - Google Analytics