`

单元测试之实践二,关于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. }  

分享到:
评论

相关推荐

    对DAO编写单元测试[1]

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

    单元测试实践小结[5]

    单元测试实践小结[5] 软件测试 7.XML:XMLUnit 8.J2EE:MockRunner 9.GUI:JFCUnit,Marathor 10.Other:JTestCase(采用XML定义测试过程) 分层架构下的单元测试 1Web层的单元测试 主要测试Controller的数据结构化...

    DAO学习

    JBuilder2006下面写的DAO实践程序。给大家做个参考。 有PPT,数据库脚本。直接拿来就能用。VO,接口,工厂,测试,驱动。事,存储过程。全部都有涉及

    Dropwizard-test:测试项目以试用 dropwizard

    Dropwizard 测试 介绍 测试 Dropwizard 的简单程序基于 用法 mvn clean package && java -jar target/dropwizard-1.0-SNAPSHOT.jar server target/classes/hello-world.yml 网址 通过在上执行 POST 来运行 GC 杂项 ...

    Flyer-maker:Java项目的脚手架工具

    Flyermaker是一个Java项目的脚手架工具,支持SpringBoot和SpringFramework,它允许动态生成工程代码和单元测试,同时尝试提供工程建造,个别场景实现的最佳实践参考,让开发人员在短时间内建造,维护,生产。...

    spark streaming实时网站分析项目实战.rar

    2.python日志产生器测试并将日志写入到文件中 3.通过定时调度工具每一分钟产生一批数据 4.使用flume实时收集日志信息 5.对接实时数据到kafka并输出到控制台 6.spark streaming对接kafka的数据进行消费 数据采集详情...

    iBATIS实战

    13.1.3 对DAO的消费层进行单元测试 235 13.2 管理iBATIS配置文件 237 13.2.1 将其保存在类路径上 237 13.2.2 集中放置文件 238 13.2.3 主要按返回类型来组织映射文件 239 13.3 命名规范 239 13.3.1 语句的命名 239 ...

    NHibernate in Action by Christian Bauer

    我们通过示例代码介绍如何实现一些诸如分层系统,单元测试这样的常用应用。同时也包括一些如何找bug的小技巧。同时我们还提供了添加像审核日志这样的自定义服务到NHibernate应用中的例子。 第九章开始讨论开发的...

    精通Spring(清晰书签版

    第3篇介绍DAO层集成技术,主要围绕JDBC、Hibernate和JPA等持久化技术展开论述,针对Spring使能应用的事务管理和集成测试,也进行了相关介绍;第4篇介绍Java EE服务及技术的集成,主要围绕企业应用中使用的各种Java ...

    spring-jpa-wicket-bootstrap:使用 Spring、JPA、Hibernate、Wicket 和 Bootstrap 的 J2EE Web 模板。 在 Tomcat 和 Postgres DB 上测试

    它演示了MvC 、 SoC 、 IoC 、 DAO 、 Service layer和Open Session in View模式以及其他 J2EE 最佳实践。 该模板可以轻松扩展为功能齐全的基于 Wicket 的 Web 应用程序。 用法 该模板使用 maven 并在 Tomcat7 上...

    tech1-temple-java:Java概念证明存储库

    DropWizard —与DAO,服务,资源层的单元测试一对多关系 GraphQL-Spring Boot作为后端API,Vue.js作为前端(SPA) Spring Boot v1 PoC-基于Spring Boot v1。*的PoC Spring Boot v2 PoC-正在开发中... 未完待续...

    计算机专业实习报告.pdf

    实习地点: 湖南省软件测评中心 专业班级:信安 1001 班 姓 名: 陈鑫 学 号:0909100727 带队老师:段桂华、宋虹 一、实习情况概述 1 、实习目的 1.1、锻炼自己的动手能力,将学习的理论知识运用于实践当中,反过来...

    基于SSM的篮球系列网上商城设计与实现(源码+部署说明+演示视频+源码介绍).zip

    源码部分包含了完整的项目结构,包括前端页面、后端控制器、实体类、DAO层接口、Service层接口及实现类、Mapper文件等。部署说明部分详细描述了如何将项目部署到Tomcat服务器上,以便进行测试和运行。演示视频展示了...

    java三大框架

    使用Spring构建的应用程序易于单元测试。 Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。 Spring帮助你解决许多问题而无需...

    JAVA程序开发大全---上半部分

    5.5 JUnit应用实例:数据库程序单元测试 77 5.6 本章小结 80 第6章 Java Web应用程序的开发 81 6.1 Java Web应用程序概述 81 6.2 Tomcat服务器的安装和配置 82 6.2.1 Tomcat服务器的下载 82 6.2.2 Tomcat服务器的...

    JAVA毕业设计之springboot021校园周边美食探索及分享平台的设计与实现完整源码.zip

    这是一个基于Spring Boot的校园周边美食探索及分享平台的设计与实现的完整源码。该平台旨在帮助学生和教职工更轻松地发现和分享...同时,该平台也为开发者提供了一个学习和实践Spring Boot、前后端分离等技术的机会。

    JAVA毕业设计之springboot011课程作业管理系统(springboot+mysql)完整源码.zip

    存放控制器类service:存放服务类dao:存放数据访问对象entity:存放实体类util:存放工具类src/main/resources:存放资源文件application.properties:配置文件static:存放静态资源,如HTML、CSS、JS等template:...

    Yii2中文手册(中文教程完整版)

    已定稿 关于 Yii 已定稿 从 Yii 1.1 升级 入门 已定稿 安装 Yii 已定稿 运行应用 已定稿 第一次问候 已定稿 使用 Forms 已定稿 玩转 Databases 已定稿 用 Gii 生成代码 已定稿 更上一层楼 应用结构 已定稿 结构概述 ...

    chess_db:Spring Boot演示REST应用程序,允许加载和搜索PGN国际象棋游戏数据库以及进行实时游戏

    国际象棋数据库 动机 使用广泛概念和模式来构建REST API的示例Spring Boot项目,以作为参考和实践。 涵盖的概念 域定义(实体,DAO,架构) ...单元测试 功能性 有关功能的说明,请参见文档。 TODO-安装/运行/浏览

    Hibernate实战(第2版 中文高清版)

     13.4 高速缓存实践   13.4.1 选择并发控制策略   13.4.2 理解高速缓存区域   13.4.3 设置本地的高速缓存提供程序   13.4.4 设置重复的高速缓存   13.4.5 控制二级高速缓存   13.5 小结   第14章 ...

Global site tag (gtag.js) - Google Analytics