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
我们的单元测试是这样写的

初始化配置资源文件
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条。
这样保证了数据的完成性。
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内存数据库)有的人喜欢。。。。
而我比较喜欢真正的写到数据库里面

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


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


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

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

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