读书人

单元测试之实践2,关于DAO的测试

发布时间: 2012-09-24 13:49:42 作者: rapoo

单元测试之实践二,关于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. 1.?public?interface?IAccountDao?extends?IBaseDao?{???? 2.?????public?Account?findAccountById(String?id);????
  2. 3.?????public?Account?findAccounByName(String?name);???? 4.?}???

实际实现代码
java 代码?
  1. package?org.wuhua.dao.impl;?? ??
  2. import?java.util.List;?? ??
  3. import?org.wuhua.dao.IAccountDao;?? import?org.wuhua.model.Account;??
  4. ?? public?class?AccountDao?extends?BaseDao?implements?IAccountDao?{?? ? public?Account?findAccountById(String?id)?{??
  5. ????????return?(Account)?this.getHibernateTemplate().get(Account.class,?id)?;?? ????}??
  6. ?? ????public?Account?findAccounByName(String?name)?{??
  7. ????????List?l?=?this.getHibernateTemplate().find("from?Account?as?a?where?a.name=?",?name);?? ????????if(l?!=?null?&&?l.size()?>=1)??
  8. ????????????return?(Account)?l.get(0);?? ????????else???
  9. ????????????return?null;?? ????}??
  10. }??

java 代码?
  1. package?org.wuhua.dao;?? ??
  2. import?java.util.ArrayList;?? import?java.util.List;??
  3. ?? import?junit.framework.Assert;??
  4. import?junit.framework.TestCase;?? ??
  5. import?org.easymock.MockControl;?? import?org.easymock.classextension.MockClassControl;??
  6. import?org.springframework.orm.hibernate3.HibernateTemplate;?? import?org.wuhua.dao.impl.AccountDao;??
  7. import?org.wuhua.model.Account;?? ??
  8. ??? ??
  9. public?class?AccountDaoTest?extends?TestCase?{?? ??????
  10. ????private?AccountDao?accountDao;?? ????private?org.springframework.orm.hibernate3.HibernateTemplate?ht;??
  11. ????private?MockControl?control;?? ??
  12. ????protected?void?setUp()?throws?Exception?{?? ????????control?=?MockClassControl.createControl(HibernateTemplate.class);??
  13. ????????ht?=?(HibernateTemplate)?control.getMock();?? ????????accountDao?=?new?AccountDao();??
  14. ????????accountDao.setHibernateTemplate(ht);?? ????}??
  15. ?? ????protected?void?tearDown()?throws?Exception?{??
  16. ??????????? ????}??
  17. ?????? ????public?void?testFindAccountById(){??
  18. ????????Account?a?=?new?Account("wuhua");?? ????????a.setId("10");?????
  19. ?????????? ????????ht.get(Account.class,?a.getId());??
  20. ?????????? ????????control.setReturnValue(a);??
  21. ?????????? ????????control.replay();??
  22. ?????????? ????????Account?result?=???accountDao.findAccountById(a.getId());??
  23. ?????????? ????????assertNotNull(result);??
  24. ?? ????????Assert.assertEquals(a.getId(),result.getId());??
  25. ????????Assert.assertEquals(a,?result);?? ??????????
  26. ????????control.verify();?? ??????????
  27. ????}?? ??????
  28. ????public?void?testFindAccountByName(){?? ????????Account?a?=?new?Account("wuhua");??????
  29. ??????????? ????????ht.find("from?Account?as?a?where?a.name=?",?a.getName());??
  30. ????????List?l?=?new?ArrayList();?? ????????l.add(a);??
  31. ????????control.setReturnValue(l);?? ??????????
  32. ????????control.replay();?? ??????????
  33. ????????Account?result?=??accountDao.findAccounByName(a.getName());?? ??
  34. ????????Assert.assertEquals(a.getId(),result.getId());?? ????????Assert.assertEquals(a,?result);??
  35. ?????????? ????????control.verify();??
  36. ?????????? ????}??
  37. }??

读书人网 >软件开发

热点推荐