`
mshijie
  • 浏览: 96110 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用Unitils测试DAO

    博客分类:
  • Java
阅读更多

上个月在博客中,讲了怎么使用dbunit帮助测试dao。但是在使用过程中,发现,使用dbunit的过程依然很繁琐。因此考虑对dbunit的使用做一些封装。期间发现开源工具Unitils已经很好的完成了这个工作。Unitils,由多个模块构成。 DatabaseModule,DbUnitModule,HibernateModule ,MockModule,EasyMockModule,InjectModule,SpringModule

我感兴趣的是dbunit和spring整合的两个模块。结合这两个模块可以很方便的完成dao的测试。

 

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

 

Unitils Tutorial

 

Using Unitils Step by Step

首先包含,unitils的库和依赖库

<dependency>
	<groupId>org.unitils</groupId>
	<artifactId>unitils</artifactId>
	<version>2.4</version>
	<scope>test</scope>
</dependency>
 

在classpath下配置 unitils.properties配置文件

database.driverClassName=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost/subcenter
database.userName=subcenter
database.password=subcenter
database.schemaNames=subcenter
database.dialect=mysql

 

在测试类上声明@RunWith(UnitilsJUnit4TestClassRunner.class),或者集成Untils提供的基类org.unitils.UnitilsJUnit3,org.unitils.UnitilsJUnit4,org.unitils.UnitilsTestNG

 

配置使用spring

在测试类中声明spring的配置文件

@SpringApplicationContext( { "classpath:persistence-test.xml",
		"classpath:beans.xml" })

 

在测试类中注入Spring bean

@SpringBeanByType
UserDAO target;

//或者注入Applicationcontext
@SpringApplicationContext
ApplicationContext  applicationcontext;

 

前面在unitisl配置文件中,制定了数据库连接,为了让spring中的bean使用相同的数据连接,可以在spring中使用unitils提供的数据源

<bean id="datasource" class="org.unitils.database.UnitilsDataSourceFactoryBean" />

 

这样unitils提供的测试数据插入和验证操作,能够和dao运行在同一个事务下。

 

同样的unitils也可以制定测试方法在执行后回滚数据库,撤销的数据库的更改。在测试类或方法上声明

@Transactional(TransactionMode.ROLLBACK)

 最后测试类应该为:

@RunWith(UnitilsJUnit4TestClassRunner.class)
@SpringApplicationContext( { "classpath:persistence-test.xml",
		"classpath:beans.xml" })
@Transactional(TransactionMode.ROLLBACK)
public class PromotionInfoDAOTest {
	@SpringBeanByType
	PromotionInfoDAO target;
}

 

使用unitils插入测试数据:

 

在测试方法上使用@DataSet注解,让unitils把以dbunit的FlatXmlDataSet格式制定的数据插入到数据库,默认使用的插入操作是CLEAN_INSERT,即插入前先清空涉及到的表。

 

在测试方法上使用@ExpectedDataSet注解,让unitils验证操作后的数据库。

 

	@Test
	@DataSet("PromotionInfoDAOTest-emputy.xml")
	@ExpectedDataSet("PromotionInfoDAOTest-after.xml")
	public void add() throws Exception {

		PromotionInfoDO promotion = DBUnitUtils.createBean(afterDataset,
				"promotion", PromotionInfoDO.class);
		promotion.setCategory(new PromotionCategoryDO(2));
		target.insert(promotion);
	}

 Notice

使用@DataSet时,可以指定一个空的XML文件,让unitils清空数据库。例如

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
	<promotion />
</dataset>  

 

使用@ExpectedDataSet验证时,unitils只会比较出现在xml文件中的字段和表。那么自增ID等不方便比较的字段可以不用在xml文件中配置,不进行比较。

 

More

是测试时,比如测试一个插入操作,我们首先写一个XML配置文件,写上要插入的表数据,然后创建一个相同字段的Bean,插入到数据库中,最后验证相同。

这个工程中,重复配置了两篇数据,不符合DYR原则。因此,我写了一个小工具类,可以从dbunits的FlatXmlDataset文件中创建Bean。

PromotionInfoDO promotion = DBUnitUtils.createBean(afterDataset,
				"promotion", PromotionInfoDO.class);
 
/**
 * 
 * 从dbunit的FlatXmlDataSet格式的xml文件创建bean
 * 
 * @author mshijie
 * 
 */
public class DBUnitUtils {

	/**
	 * 从dbunit的flatXmlDataSet中,创建多个bean
	 * 
	 * @param <T>
	 * @param file
	 * @param clazz
	 * @param ignoredProps
	 * @return
	 * @throws Exception
	 */
	public static <T> List<T> createBeans(String file, String tableName,
			Class<T> clazz) throws Exception {
                  //................................
	}

	/**
	 * 从dbunit的flatXmlDataSet中,创建bean
	 * 
	 * @param <T>
	 * @param file
	 * @param clazz
	 * @param ignoredProps
	 * @return
	 * @throws Exception
	 */
	public static <T> T createBean(String file, String tableName, Class<T> clazz)
			throws Exception {
		 //................................	
         }

        //...............................................................
}
 

完整代码见附件

 

 

1
0
分享到:
评论

相关推荐

    Integrete unitils for database(dao) testing

    总结起来,使用Unitils进行数据库测试可以帮助开发者更高效地进行DAO层的验证,通过自动化管理数据库状态、数据注入、事务处理等功能,使得测试更加简洁和可靠。通过阅读Caerun的博客和分析示例代码,我们可以深入...

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

    16.5 使用Unitils测试DAO层 16.5.1 数据库测试的难点 16.5.2 扩展Dbunit用Excel准备数据 16.5.3 测试实战 16.6 使用unitils测试Service层 16.7 测试Web层 16.7.1 对LoginController进行单元测试 16.7.2 使用Spring ...

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

    16.5 使用Unitils测试DAO层 16.5.1 数据库测试的难点 16.5.2 扩展Dbunit用Excel准备数据 16.5.3 测试实战 16.6 使用unitils测试Service层 16.7 测试Web层 16.7.1 对LoginController进行单元测试 16.7.2 使用Spring ...

    使用junit测试ssh中的dao

    标题“使用junit测试ssh中的dao”涉及到的是Java开发中的单元测试技术,特别是针对SSH(Struts2、Spring、Hibernate)框架中的数据访问对象(DAO)进行测试。SSH是Java Web开发中常用的三大开源框架,它们协同工作以...

    SpringBoot 多模块Dao层单元测试

    这里我们可以使用Mockito来创建Dao层所依赖的数据源的模拟对象,避免在测试中实际访问数据库。测试类示例: ```java import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito....

    junit测试spring,hibernate的dao层代码

    将 `JUnit` 与 `Spring`、`Hibernate` 结合使用,可以对 `DAO(Data Access Object)` 层进行有效的测试,确保数据访问逻辑的正确性。 首先,`DAO` 层是业务逻辑和数据库操作之间的隔离层,通常包含了增删改查等...

    自动测试所有dao单元测试

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

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

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

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

    如果DAO方法涉及数据库操作,可以考虑使用Spring的`@Transactional`注解,确保测试后数据库状态回滚,避免影响其他测试。 对于SpringJDBC中的Druid数据源,它是一个高效、强大的连接池实现。在测试中,我们可以配置...

    ormlite使用中的dao简化写法

    ORMLite提供了一些自动化工具,例如使用注解来定义字段和方法,以及使用`@DatabaseField`和`@ForeignCollectionField`等注解来自动生成相应的DAO代码。 描述"ormlite使用中的dao简化写法,告别繁琐的dao代码"暗示了...

    mybatis入门测试dao资源

    标题 "mybatis入门测试dao资源" 提到的是关于MyBatis框架的基础学习和DAO(Data Access Object)层的测试。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。其核心是将SQL语句与Java代码...

    使用MVC+DAO完成用户登陆(代码+笔记)

    在IT行业中,MVC(Model-View-Controller)和DAO(Data Access Object)模式是两种常见的软件...文件"项目07_使用MVC+DAO完成用户登陆(代码+笔记)"应该包含了实现这一功能的详细步骤和代码示例,可以进一步学习和参考。

    unitils-3.3-with-dependencies.zip

    为了使用这个压缩包,你需要将其中的jar文件添加到你的项目类路径中,然后按照Unitils的文档或示例代码来配置和使用测试框架。这样,你就可以充分利用Unitils提供的便利,提高测试的效率和质量。

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

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

    使用Spring实现DAO模式

    使用Spring实现DAO模式 在软件开发领域,设计模式是一种被广泛接受的解决特定问题的方案。其中,DAO(Data Access Object)模式旨在提供一种抽象的数据访问机制,将数据访问的逻辑封装在一个对象中,从而使得应用...

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

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

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

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

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

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

    使用Struts + DAO + Hibernate完成用户登陆

    8. **测试**:使用模拟用户数据进行单元测试,确保登录功能正常运行。 这个实例不仅提供了一个学习如何整合Struts、DAO和Hibernate的基础模板,也演示了如何在实际项目中实现用户认证这一常见功能。对于初学者,这...

Global site tag (gtag.js) - Google Analytics