`
iamlibo
  • 浏览: 68807 次
社区版块
存档分类
最新评论

使用DBUnit测试SpringDao

阅读更多

环境是这样的:

一个DAO接口 ,一个DAO的缺省实现类,这个实现了DAO接口的所有方法,并使用了泛型,所以其他的DAO实现类都省下了,不用写了.因为所有的操作都在这个缺省实现类里面完成了.只需要在Spring 配置文件中配置一下就可以了。因为使用Hibernate,所以表之间的关系还是要测试的。测试也就离不开Spring环境了。还好Spring提供了好多测试类可以扩展,我使用的是AbstractTransactionalDataSourceSpringContextTests,据说它可以保持数据的清洁,操作完之后就回滚。跟据我的测试在没有加flush()时候它好象根本就没有插入到数据库中,在加入flush()之后数据还是保留在数据库中,没有回滚(删除)掉。测试的结果:

没加入flush() :

[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试部门[01] success :01
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试部门[01] success :01
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试[ 001 ] success :001
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试[ 001 ] success :001
保存成功 :001
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution

按照这个提示应该是成功了。可是缺了插入和删除的语句(因为我的Hibernate是showSql的),感觉并没有真的向数据库里写入数据。感觉不放心!!!

加入flush() :
2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
[2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
Hibernate: insert into Department (Manager, Name, Parent, Tel, Id) values (?, ?, ?, ?, ?)
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试部门[01] success :01
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试部门[01] success :01
Hibernate: insert into Users (Departmentid, Name, Password, Id) values (?, ?, ?, ?)
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试[ 001 ] success :001
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试[ 001 ] success :001
保存成功 :001
[2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution
[2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution

这回出现在插入数据的语句了。但是操作完的数据还在数据库里呆着呢!!!

为了保险起见,还要自己来清理垃圾吧!所以引入DBUnit

在原有的测试之前通过DBUnit准备数据,在测试之后清量数据。真是任劳任怨!

看一下代码:这个是Dao的测试基本类,其他的测试都继续这个就可以了。

package test.support;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

/**
* Dao 测试基础类
*
* @author libo <br>
* @version 1.0 2007-9-6<br>
*/
public abstract class BaseDaoTest extends
AbstractTransactionalDataSourceSpringContextTests {

private ApplicationContext ctx;

private BasicDataSource dataSource;

private IDatabaseConnection connection;

public void execute(String path, DatabaseOperation oper) {
IDataSet dataset;
try {
dataset = new FlatXmlDataSet(new FileInputStream(path));
if (connection == null) {
if (dataSource == null)
dataSource = (BasicDataSource) getBean("dataSource");
if (dataSource != null) {
connection = new DatabaseConnection(this.dataSource
.getConnection());

// connection = new DatabaseConnection(this.dataSource
// .getConnection(), "schema");

} else
System.out.println("date source is null !!!!");
}
if (connection != null) {
// System.out.println("开始执行");
oper.execute(connection, dataset);

} else
System.out.println("connection is null!!!");

} catch (DataSetException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (DatabaseUnitException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}

protected String[] getConfigLocations() {
return new String[] { "classpath:/applicationContext_test.xml",
"classpath:/beans.xml" };
}

public Object getBean(String beanName) {
if (ctx == null)
ctx = new FileSystemXmlApplicationContext(getConfigLocations());
return ctx.getBean(beanName);
}

}

来看一个具体的测试类:

public class UserDaoTest extends BaseDaoTest {
private String dataSet = "bin/cn/xiangyunsoft/sysadmin/dao/impl/user.xml";//DBUnit需用的文件的位置

private IDao<User> dao = (IDao<User>) getBean("userDao");
public void testSaveOrUpdate() {
execute(dataSet, DatabaseOperation.DELETE_ALL); //测试前准备测试数据环境
Department department =new Department();
department.setId("01");
department.setName("测试部门");
dao.save(department);

User dep = new User();
dep.setId("001");
dep.setName("测试");
dep.setDepartment(department);
Serializable s = dao.save(dep);
System.out.println("保存成功 :" + s);
assertNotNull(s);
execute(dataSet, DatabaseOperation.DELETE); //清除测试时的数据
}

现在来看测试的效果还是可以的。不知道以后遇到更复杂的表好不好用。


<!----> Technorati : dao, dbunit

分享到:
评论

相关推荐

    主题:在Spring中结合Dbunit对Dao进行集成单元测试

    下面将详细介绍如何在Spring中使用Dbunit进行Dao的集成单元测试。 首先,我们需要理解集成测试的概念。集成测试是在所有模块单独通过单元测试后,将它们组合在一起进行的测试,目的是检查模块间的交互是否正确。在...

    spring与dbunit集成测试

    6. **编写测试**:在测试方法中,使用Spring的`@Autowired`注解注入需要测试的服务或DAO,然后调用其方法进行验证。结合DBUnit,可以确保测试前后数据库状态的一致性。 7. **异常处理和断言**:根据业务需求,使用...

    对dbunit进行mybatis DAO层Excel单元测试(必看篇)

    五、Dbunit测试实践 在mybatis DAO层中,可以使用dbunit来进行单元测试。首先,需要在pom.xml文件中添加相关的依赖项,然后创建一个unitils.properties配置文件,用于配置自定义拓展模块,数据加载等相关信息。接着...

    DBUnit测试规范[收集].pdf

    在本文中,我们将深入探讨DBUnit测试规范及其在软件开发中的应用。 首先,按照DBUnit测试规范,项目流程通常包括以下几个步骤: 1. **自动生成测试类**:基于被测试的接口,开发者应自动生成对应的test class文件...

    使用Unitils测试DAO

    综上所述,"使用Unitils测试DAO"的主题涵盖了如何利用Unitils库和DBUnit组件来创建可靠的DAO层测试,包括数据库的初始化、数据集的管理、断言的使用,以及自定义工具类的创建和源码分析。这种测试方法有助于提升代码...

    Spring3单元测试和集成测试

    例如,我们可以创建一个测试类,通过`@ContextConfiguration`指定配置文件路径,然后在测试方法中使用`@Autowired`注入需要测试的服务或DAO,最后编写断言来验证方法行为。 ```java import org.junit.Test; import ...

    spring3学习笔记(2)-集成ibatis3进行单元测试

    5. 使用@Autowired注解:Spring的依赖注入可以帮助我们轻松地在Service层或DAO层注入Mapper接口实例,无需手动创建。 接下来,进入单元测试部分。在Spring中,我们可以使用JUnit和Mockito等工具进行单元测试。针对...

    spring-test-dbunit-template

    弹簧测试数据库单元模板 使用简化CRUD测试的扩展最新发布0.1.1 您可以在Maven中央存储库中下载二进制文件: Gradle testCompile 'com.github.hippoom:spring-test-dbunit-template: 0.1 . 1 ' 玛文 &lt; dependency&gt; ...

    Spring.3.x企业应用开发实战(完整版).part2

    16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要功能流程描述 17.2 系统设计 17.2.1 技术...

    Spring3.x企业应用开发实战(完整版) part1

    16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要功能流程描述 17.2 系统设计 17.2.1 技术...

    用 hibernate 和 spring 开发持久层.doc

    同时,测试时可以利用Spring的Mockito或DBUnit进行单元测试,确保持久层的正确性。 5. 测试驱动开发(TDD) 在文章中提到的示例中,使用了DbUnit进行测试驱动开发。TDD是一种软件开发方法,强调先写测试用例,再...

    unitils-3.3-with-dependencies.zip

    8. **DAO测试**:提供了专门的工具来测试数据访问对象(DAO),包括对SQL查询结果的验证。 9. **异常验证**:可以验证方法是否抛出了预期的异常,以及异常的类型和消息。 10. **持久层测试**:支持对实体和会话...

    springside4

    使用JUnit和Mockito进行单元测试,通过Spring Test和DBUnit进行集成测试,确保代码的质量和稳定性。 六、代码质量管理与重构 SpringSide 4 遵循良好的编码规范,如SOLID原则,以及代码重构的最佳实践。通过学习...

    JavaEE求职简历-姓名-JAVA开发工程师.doc

    - 使用SpringTest和DBunit简化DAO层测试,EasyMock进行Service层逻辑测试。 - 采用EHcache和Redis的缓存预热机制提升系统性能。 - 使用Redis的SortedSet实现热门商品和人气商品的排序展示。 - 集成了FastDFS作为...

    struts2+spring3+hibernate3+jquery+springside 做一个OA2

    Spring3 版本是较早的一个稳定版本,支持AOP、DAO、JDBC、Hibernate等整合,用于构建松耦合、模块化的应用程序。 3. **Hibernate3**: Hibernate 是一个流行的ORM(对象关系映射)框架,它简化了Java应用程序与...

    Hibernate quickly 2006

    同时,本章也强调了使用数据访问对象模式(DAO)的重要性,它可以将业务逻辑与数据访问逻辑分离,提高代码的复用性和可测试性。 #### 八、Web框架:WebWork、Struts 和 Tapestry(Web frameworks: WebWork, Struts,...

    Manning_Hibernate.Quickly

    为了确保代码的质量,本书还强调了单元测试的重要性,并介绍了如何使用JUnit和DBUnit进行单元测试,以及如何将测试集成到持续集成流程中。单元测试能够帮助开发者及时发现并修复代码中的错误,提高软件的稳定性和...

    ssh框架的登陆注册

    JUnit可以用于测试Action和Service层,而数据库相关的测试可以借助Hibernate的Session模拟,或者使用数据库测试工具如DBUnit。 以上是SSH框架与Oracle数据库在登录注册场景中的核心知识点,通过理解并熟练掌握这些...

    spring-mybatis:Spring扁桃

    而 Spring Test 和 DBUnit 则可以用于集成测试,模拟真实环境验证整个系统的功能。 10. **最佳实践**:在实际开发中,为了提高代码可读性和可维护性,建议遵循一定的编码规范,如:合理划分 Service 和 DAO 层,...

Global site tag (gtag.js) - Google Analytics