`
wh870712
  • 浏览: 40321 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论
阅读更多
前阵子发表过 我的第一个真正意义上的测试 。
里面对于测试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();  
          
    }  
}  
分享到:
评论

相关推荐

    SpringBoot 多模块Dao层单元测试

    本篇文章将重点讲解如何在IDEA环境下,针对Spring多模块项目中的Dao层进行单元测试。 首先,我们要理解什么是单元测试。单元测试是一种软件测试方法,它针对程序中的最小可测试单元,如方法或类,进行独立验证。在...

    使用junit测试ssh中的dao

    在实际开发中,对于SSH框架中的DAO测试,还需要关注事务管理、数据库连接池配置、SQL语句的执行效率等方面。同时,集成测试也是必要的,特别是在涉及多层服务交互时,以确保整个系统的行为符合预期。通过单元测试和...

    关于DAO的相关论文

    8. 测试友好:由于DAO将数据库操作封装,可以使用Mock对象对业务逻辑进行单元测试,而无需真正连接数据库,提高了测试效率。 9. 安全性:DAO模式可以通过限制DAO接口的权限来增强安全性,防止非法的数据库访问。 ...

    junit测试spring,hibernate的dao层代码

    在测试 `DAO` 层时,我们不希望真正地连接到数据库,而是使用模拟数据或内存数据库来避免副作用和提高测试效率。 在整合 `JUnit` 进行测试时,我们需要使用 `Spring` 的测试支持,如 `@ContextConfiguration` 注解...

    使用Unitils测试DAO

    分析DBUnitUtils类的源码可以帮助我们理解作者是如何结合Unitils与DBUnit进行DAO测试的。这可能包括对特定数据库操作的模拟,如事务管理、异常处理以及数据验证逻辑。 6. **工具的使用和集成**: Unitils可以与...

    自动测试所有dao单元测试

    NULL 博文链接:https://zhuliang1984723.iteye.com/blog/2260856

    JDBC相关单元测试及通用的Dao

    jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。

    利用JUnit和Spring-test对SpringJDBC组件DAO层测试

    本话题将深入讲解如何利用JUnit和Spring-test这两个工具对SpringJDBC组件的DAO层进行有效测试。 首先,JUnit是一个流行的Java单元测试框架,它允许开发者编写可重复运行的测试用例,以验证代码的正确性。在针对...

    Android-KBUnitTest是一款轻量级DAO单元测试框架

    KBUnitTest是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。KBUnitTest支持原生SQLiteDatabase操作及GreenDAO、Afinal、XUtils、DbFlow第三方...

    Dao Jet数据库引擎

    5. 验证DAO是否正常工作,可以通过编写简单的VBA代码(Visual Basic for Applications)测试数据库连接。 需要注意的是,DAO Jet数据库引擎主要适用于较旧的系统和应用程序,新版本的Microsoft Office和Windows操作...

    关于java dao的入门介绍

    总之,DAO模式在Java应用中起着至关重要的作用,它简化了数据库操作,提高了代码的可测试性和可维护性。通过恰当的事务界定、异常处理和日志记录,可以增强系统的稳定性和可诊断性。在设计和实现DAO时,需要充分理解...

    经典spring关于关于dao模式的开发案例

    7. **单元测试**:Spring的TestContext框架使得编写DAO层的单元测试变得简单,可以模拟数据源并注入到测试类中,进行隔离的测试。 8. **依赖注入**:通过Spring的IoC容器,可以将数据源、SessionFactory或...

    DAO详解 详细讲述了DAO的使用

    - **解耦**:DAO模式将数据访问逻辑与业务逻辑分离,使得两者可以独立开发和测试。 - **复用**:通过接口,可以创建多个实现类,以支持多种数据库(如MySQL、Oracle),提高代码复用性。 - **易维护**:修改数据访问...

    DAO设计模式 DAO 设计模式 JAVA设计模式

    DAO(Data Access Object)设计模式是软件开发中一种常见的用于处理数据访问的模式,它将业务逻辑与数据访问逻辑分离,使得代码结构更加清晰,更易于维护和测试。在Java开发中,DAO模式广泛应用于数据库操作,为应用...

    DAO单元测试

    今天我将展示一下我是如何在实际中对dao进行单元测试的首先我们来确认一下dao需要什么样的环境,我的dao是用Spring+hibernate来构建的,而对应的数据源是oracle9。所以要进行dao的测试我需要从Spring的连接oracle的...

    dao 1.0 source code

    6. **测试策略**:通过测试类了解如何对DAO进行单元测试,确保其功能的正确性。 总之,DAO 1.0的源代码为我们提供了一个研究和学习数据库访问层设计的实例,有助于提升我们的软件设计能力和数据库操作技能。通过...

    DAO 数据访问对象

    对于测试,DAO层因为与数据库交互,通常是难以直接进行单元测试的。但通过使用Mock对象或者内存数据库(如H2),可以模拟数据库行为,对DAO进行隔离测试。此外,由于DAO提供了清晰的接口,它也方便进行集成测试。 ...

    DAO_ACCESS.rar_access dao_access使用DAO_com.dao.dao_dao access

    本压缩包"DAO_ACCESS.rar"包含了关于使用DAO模式访问ACCESS数据库的相关资料,特别是通过Java的DAO接口实现。以下是关于这一主题的详细知识: 1. **DAO模式**:DAO模式是软件设计中的一个基础概念,它定义了一个...

    VC DAO 操作Access的测试例子.rar

    VC DAO 操作Access的测试例子,本演示是VC 使用DAO连接Access数据库的一个测试程序,学习如何使用DAO操作Access,通过添加一个数据库记录来演示添加、删除、插入数据的例子,比较简单,面向VC 初学者的一个例子。...

    JavaWeb DAO设计模式DEMO

    7. **测试**:由于DAO层与具体的数据库操作解耦,我们可以编写单元测试来验证其功能,这通常会使用到Mock对象或者内存数据库如H2。 这个"JavaWeb DAO设计模式DEMO"项目很可能会包含以下文件: - `User.java`: 用户...

Global site tag (gtag.js) - Google Analytics