前阵子发表过 我的第一个真正意义上的测试 。
里面对于测试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();
}
}
分享到:
相关推荐
本篇文章将重点讲解如何在IDEA环境下,针对Spring多模块项目中的Dao层进行单元测试。 首先,我们要理解什么是单元测试。单元测试是一种软件测试方法,它针对程序中的最小可测试单元,如方法或类,进行独立验证。在...
在实际开发中,对于SSH框架中的DAO测试,还需要关注事务管理、数据库连接池配置、SQL语句的执行效率等方面。同时,集成测试也是必要的,特别是在涉及多层服务交互时,以确保整个系统的行为符合预期。通过单元测试和...
8. 测试友好:由于DAO将数据库操作封装,可以使用Mock对象对业务逻辑进行单元测试,而无需真正连接数据库,提高了测试效率。 9. 安全性:DAO模式可以通过限制DAO接口的权限来增强安全性,防止非法的数据库访问。 ...
在测试 `DAO` 层时,我们不希望真正地连接到数据库,而是使用模拟数据或内存数据库来避免副作用和提高测试效率。 在整合 `JUnit` 进行测试时,我们需要使用 `Spring` 的测试支持,如 `@ContextConfiguration` 注解...
分析DBUnitUtils类的源码可以帮助我们理解作者是如何结合Unitils与DBUnit进行DAO测试的。这可能包括对特定数据库操作的模拟,如事务管理、异常处理以及数据验证逻辑。 6. **工具的使用和集成**: Unitils可以与...
NULL 博文链接:https://zhuliang1984723.iteye.com/blog/2260856
jdbc详细测试用例,包括connection ,statement,preparedstatement,resultset,BeanUtils,DBUtils,数据库连接池dbcp,cp03的单元测试,及dao层的统一封装,适合项目开发人员学习和项目中使用。
本话题将深入讲解如何利用JUnit和Spring-test这两个工具对SpringJDBC组件的DAO层进行有效测试。 首先,JUnit是一个流行的Java单元测试框架,它允许开发者编写可重复运行的测试用例,以验证代码的正确性。在针对...
KBUnitTest是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。KBUnitTest支持原生SQLiteDatabase操作及GreenDAO、Afinal、XUtils、DbFlow第三方...
5. 验证DAO是否正常工作,可以通过编写简单的VBA代码(Visual Basic for Applications)测试数据库连接。 需要注意的是,DAO Jet数据库引擎主要适用于较旧的系统和应用程序,新版本的Microsoft Office和Windows操作...
总之,DAO模式在Java应用中起着至关重要的作用,它简化了数据库操作,提高了代码的可测试性和可维护性。通过恰当的事务界定、异常处理和日志记录,可以增强系统的稳定性和可诊断性。在设计和实现DAO时,需要充分理解...
7. **单元测试**:Spring的TestContext框架使得编写DAO层的单元测试变得简单,可以模拟数据源并注入到测试类中,进行隔离的测试。 8. **依赖注入**:通过Spring的IoC容器,可以将数据源、SessionFactory或...
- **解耦**:DAO模式将数据访问逻辑与业务逻辑分离,使得两者可以独立开发和测试。 - **复用**:通过接口,可以创建多个实现类,以支持多种数据库(如MySQL、Oracle),提高代码复用性。 - **易维护**:修改数据访问...
DAO(Data Access Object)设计模式是软件开发中一种常见的用于处理数据访问的模式,它将业务逻辑与数据访问逻辑分离,使得代码结构更加清晰,更易于维护和测试。在Java开发中,DAO模式广泛应用于数据库操作,为应用...
今天我将展示一下我是如何在实际中对dao进行单元测试的首先我们来确认一下dao需要什么样的环境,我的dao是用Spring+hibernate来构建的,而对应的数据源是oracle9。所以要进行dao的测试我需要从Spring的连接oracle的...
6. **测试策略**:通过测试类了解如何对DAO进行单元测试,确保其功能的正确性。 总之,DAO 1.0的源代码为我们提供了一个研究和学习数据库访问层设计的实例,有助于提升我们的软件设计能力和数据库操作技能。通过...
对于测试,DAO层因为与数据库交互,通常是难以直接进行单元测试的。但通过使用Mock对象或者内存数据库(如H2),可以模拟数据库行为,对DAO进行隔离测试。此外,由于DAO提供了清晰的接口,它也方便进行集成测试。 ...
本压缩包"DAO_ACCESS.rar"包含了关于使用DAO模式访问ACCESS数据库的相关资料,特别是通过Java的DAO接口实现。以下是关于这一主题的详细知识: 1. **DAO模式**:DAO模式是软件设计中的一个基础概念,它定义了一个...
VC DAO 操作Access的测试例子,本演示是VC 使用DAO连接Access数据库的一个测试程序,学习如何使用DAO操作Access,通过添加一个数据库记录来演示添加、删除、插入数据的例子,比较简单,面向VC 初学者的一个例子。...
7. **测试**:由于DAO层与具体的数据库操作解耦,我们可以编写单元测试来验证其功能,这通常会使用到Mock对象或者内存数据库如H2。 这个"JavaWeb DAO设计模式DEMO"项目很可能会包含以下文件: - `User.java`: 用户...