路是爬出来的

单元测试之实践二,关于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. 1public interface IAccountDao extends IBaseDao {    

  2. 2.     public Account findAccountById(String id);    

  3. 3.     public Account findAccounByName(String name);    

  4. 4. }   





实际实现代码

java 代码


 


  1. package org.wuhua.dao.impl;  

  2.   

  3. import java.util.List;  

  4.   

  5. import org.wuhua.dao.IAccountDao;  

  6. import org.wuhua.model.Account;  

  7.   

  8. public class AccountDao extends BaseDao implements IAccountDao {  

  9.   public Account findAccountById(String id) {  

  10.         return (Account) this.getHibernateTemplate().get(Account.class, id) ;  

  11.     }  

  12.   

  13.     public Account findAccounByName(String name) {  

  14.         List l = this.getHibernateTemplate().find("from Account as a where a.name=?", name);  

  15.         if(l != null && l.size() >=1)  

  16.             return (Account) l.get(0);  

  17.         else   

  18.             return null;  

  19.     }  

  20. }  





java 代码


 


  1. package org.wuhua.dao;  

  2.   

  3. import java.util.ArrayList;  

  4. import java.util.List;  

  5.   

  6. import junit.framework.Assert;  

  7. import junit.framework.TestCase;  

  8.   

  9. import org.easymock.MockControl;  

  10. import org.easymock.classextension.MockClassControl;  

  11. import org.springframework.orm.hibernate3.HibernateTemplate;  

  12. import org.wuhua.dao.impl.AccountDao;  

  13. import org.wuhua.model.Account;  

  14.   

  15.    

  16.   

  17. public class AccountDaoTest extends TestCase {  

  18.       

  19.     private AccountDao accountDao;  

  20.     private org.springframework.orm.hibernate3.HibernateTemplate ht;  

  21.     private MockControl control;  

  22.   

  23.     protected void setUp() throws Exception {  

  24.         control = MockClassControl.createControl(HibernateTemplate.class);  

  25.         ht = (HibernateTemplate) control.getMock();  

  26.         accountDao = new AccountDao();  

  27.         accountDao.setHibernateTemplate(ht);  

  28.     }  

  29.   

  30.     protected void tearDown() throws Exception {  

  31.            

  32.     }  

  33.       

  34.     public void testFindAccountById(){  

  35.         Account a = new Account("wuhua");  

  36.         a.setId("10");     

  37.           

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

  39.           

  40.         control.setReturnValue(a);  

  41.           

  42.         control.replay();  

  43.           

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

  45.           

  46.         assertNotNull(result);  

  47.   

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

  49.         Assert.assertEquals(a, result);  

  50.           

  51.         control.verify();  

  52.           

  53.     }  

  54.       

  55.     public void testFindAccountByName(){  

  56.         Account a = new Account("wuhua");      

  57.            

  58.         ht.find("from Account as a where a.name=?", a.getName());  

  59.         List l = new ArrayList();  

  60.         l.add(a);  

  61.         control.setReturnValue(l);  

  62.           

  63.         control.replay();  

  64.           

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

  66.   

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

  68.         Assert.assertEquals(a, result);  

  69.           

  70.         control.verify();  

  71.           

  72.     }  

  73. }  


posted on 2006-12-30 09:06 路是爬出来的 阅读(128) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: