关于DAO的测试

前阵子发表过 我的第一个真正意义上的测试 。
里面对于测试Service大家是没有意义的,对于测试DAO层则表现各有各的看法。
比如

robbin 大哥建议:

测试DAO不如连数据库一起测试吧。因为DAO测试的目的不是DAO接口实现对不对,而是测试是否如你预期的发送了SQL,如你预期的返回了结果集。这个时候你Mock之后,测试就没有意义了。


hyysguyang 大哥建议:篇
wuhua 写道
分层的原因很多。这里我的看法片面就不说了
但对于mock来说是有莫大好处的。
比如service测试的时候完全可以做到隔离数据库,
我现在的意思是,
居然Service可以隔离Dao层,也就是说Dao层也是可以做到隔离相关的数据实现的。也是可以mock一个对象。而并非用实际的连接去代 替。如果我们的逻辑没出错的话,测试就算通过了,至于数据层的检测,那就不关我们的事情了,比如Hibernate由Hibernate去test, Spring由Spring去Test,Oracle由它自己去做。干自己的事情,别趟其他浑水。这样不是潇洒很多吗

但是数据库的测试毕竟比较特殊,记住测试的目的是确保你的代码质量,如果你确定你的这样测就没问题了,那无话可说,否则就尽量多的测试。
事实上,最原始的单元测试(plain testcase)就是用来测方法,测业务逻辑的,如果有逻辑就测,没逻辑就不用测了,同样的道理,相信你不会去测一个bean的get/set方法吧。
记住你测试的目的和动机,如果你认为测试dao层是为了测你的逻辑(你确定你的dao的实现代码是否真的存在逻辑),那你就mock吧,但是,我 们更相信,我们测DAO层,更应该是测访问数据库的情况,你如连接,sql是否正确,sequence是否正确等,而这些你必须要真正的连接数据库,也因 此,我们一般都是直接访问数据库来测试的,当然,如果可能你可以采用内存库。
事实上,我们对dao的测试,一般都进行所谓的的集成单元测试。我认为,你应该确定好你的测试策略,然后在去采用相应的测试方法。我在目前的开发中就是采用这样的方式测的。

上面两个大哥都建议测试DAO的时候还是连接数据库为好。
但个人认为上面两个大哥的单元测试以非纯正的单元测试了,而是集成单元测试。
其实说白了,测试这东西只是为了项目更好,更快的完成。至于是否要求纯单元,或者是集成单元测试,则看各位的需要,如果觉得集成单元测试对项目有帮助,那就用吧,现在发现对这个已经没有明显的界限了。


不理会它了,现在回归到我们用户注册的例子。

java 代码

1. public interface IAccountDao extends IBaseDao {
2. public Account findAccountById(String id);
3. public Account findAccounByName(String name);
4. }

实际实现代码

java 代码

package org.wuhua.dao.impl;

import java.util.List;

import org.wuhua.dao.IAccountDao;
import org.wuhua.model.Account;

public class AccountDao extends BaseDao implements IAccountDao {
public Account findAccountById(String id) {
return (Account) this.getHibernateTemplate().get(Account.class, id) ;
}

public Account findAccounByName(String name) {
List l = this.getHibernateTemplate().find("from Account as a where a.name=?", name);
if(l != null && l.size() >=1)
return (Account) l.get(0);
else
return null;
}
}


java 代码

package org.wuhua.dao;

import java.util.ArrayList;
import java.util.List;

import junit.framework.Assert;
import junit.framework.TestCase;

import org.easymock.MockControl;
import org.easymock.classextension.MockClassControl;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.wuhua.dao.impl.AccountDao;
import org.wuhua.model.Account;



public class AccountDaoTest extends TestCase {

private AccountDao accountDao;
private org.springframework.orm.hibernate3.HibernateTemplate ht;
private MockControl control;

protected void setUp() throws Exception {
control = MockClassControl.createControl(HibernateTemplate.class);
ht = (HibernateTemplate) control.getMock();
accountDao = new AccountDao();
accountDao.setHibernateTemplate(ht);
}

protected void tearDown() throws Exception {

}

public void testFindAccountById(){
Account a = new Account("wuhua");
a.setId("10");

ht.get(Account.class, a.getId());

control.setReturnValue(a);

control.replay();

Account result = accountDao.findAccountById(a.getId());

assertNotNull(result);

Assert.assertEquals(a.getId(),result.getId());
Assert.assertEquals(a, result);

control.verify();

}

public void testFindAccountByName(){
Account a = new Account("wuhua");

ht.find("from Account as a where a.name=?", a.getName());
List l = new ArrayList();
l.add(a);
control.setReturnValue(l);

control.replay();

Account result = accountDao.findAccounByName(a.getName());

Assert.assertEquals(a.getId(),result.getId());
Assert.assertEquals(a, result);

control.verify();

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值