`
笨鸟先飞
  • 浏览: 28947 次
  • 来自: ...
社区版块
存档分类
最新评论

基于Spring的测试类进行DAO层集成测试实践(1)

阅读更多

资源准备:

mysql5.0

spring-2.5

hibernate-3.2.5

junit-4.4.jar

 

 

 

 

创建表

 

DROP TABLE IF EXISTS `myproject`.`boys`;
CREATE TABLE  `myproject`.`boys` (
  `id` bigint(20) NOT NULL auto_increment,
  `phone` varchar(20) default NULL,
  `sex` varchar(2) default NULL,
  `address` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

创建相关配置文件:

 

(1)applicationContext-resources.xml

 

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

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:jee="http://www.springframework.org/schema/jee"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
   http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
 
 
 <!--<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
  <list>
  <value>classpath:jdbc.properties</value>
  </list>
  </property>
  </bean>
 -->
 <context:property-placeholder location="classpath:jdbc.properties" />
 <!-- =====使用dbcp 连接池 -->
 <bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
  p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
  p:username="${jdbc.username}" p:password="${jdbc.password}" />
 <!-- Hibernate SessionFactory -->
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
  p:dataSource-ref="dataSource"
  p:mappingResources="testHibernate.hbm.xml">
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     ${hibernate.dialect}
    </prop>
    <prop key="hibernate.show_sql">
     ${hibernate.show_sql}
    </prop>
    <!--<prop key="hibernate.generate_statistics">
     ${hibernate.generate_statistics}
     </prop>
    -->
   </props>
  </property>
 </bean>
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager"
  p:sessionFactory-ref="sessionFactory" />
 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="find*" read-only="true" />
   <tx:method name="get*" read-only="true" />
   <!-- 所有抛出异常都要回滚 -->
   <tx:method name="*" rollback-for="Throwable" />
  </tx:attributes>
 </tx:advice>

<!-- com.jmesa.test.service包下面(包括子包)后缀为Service的所有bean -->
 <aop:config>
  <aop:pointcut id="serviceOperation"
   expression="execution(* com.jmesa.test.service..*Service.*(..))" />
  <aop:advisor pointcut-ref="serviceOperation"
   advice-ref="txAdvice"/>
 </aop:config>
</beans>

 

(2) applicationContext-dao.xml

 

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

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:jee="http://www.springframework.org/schema/jee"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
   http://www.springframework.org/schema/jee htp://www.springframework.org/schema/jee/spring-jee-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
 
 
 <bean name="boysDAO" class="com.jmesa.test.dao.hibernate.BoysDAOImpl" autowire="byName"></bean>
</beans>

 

(3)jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/myproject?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql=true

(4) boys 实体的hibernate配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping auto-import="true" default-lazy="false">
 <class name="com.jmesa.test.model.Boy" table="boys">
  <id name="id" column="id" type="long">
   <generator class="identity"></generator>
  </id>
  <property name="phone" column="phone"></property>
  <property name="sex" column="sex"></property>
  <property name="address"></property>
 </class>
</hibernate-mapping>

 

 

创建BoysDAO 接口

 

package com.jmesa.test.dao;

import java.util.List;

import com.jmesa.test.common.EntityFilters;
import com.jmesa.test.common.EntitySorts;
import com.jmesa.test.model.Boy;

public interface BoysDAO {
 /**
  *
  * @param boy
  *            域对象
  */
 public void save(Boy boy);

 /**
  * 更新boy数据
  *
  * @param boy
  */
 public void update(Boy boy);

 /**
  * 依据id值获得boy域对象
  *
  * @param id
  * @return
  */
 public Boy get(String id);

 /**
  * 获得所有boy域对象
  *
  * @return
  */
 public List<Boy> getAll();

/**
  * 依据boy 属性条件查询boy列表
  *
  * @param phone
  *            空或者null值将不作为查询条件
  * @param sex
  *            空或者null值将不作为查询条件
  * @return
  */
 public List<Boy> queryBoys(String phone, String sex);

}

 

BoysDAO 接口实现类:

package com.jmesa.test.dao.hibernate;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Property;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.jmesa.test.dao.BoysDAO;
import com.jmesa.test.model.Boy;

public class BoysDAOImpl extends HibernateDaoSupport implements BoysDAO {

 public Boy get(String id) {
  return (Boy) this.getHibernateTemplate().load(Boy.class, id);
 }

 public List<Boy> getAll() {
  return queryBoys(null, null);
 }

 public List<Boy> queryBoys(String phone, String sex) {
  DetachedCriteria query = DetachedCriteria.forClass(Boy.class);
  if (phone != null && !phone.equals("")) {
   query.add(Property.forName("phone").eq(phone));
  }
  if (sex != null && !sex.equals("")) {
   query.add(Property.forName("sex").eq(sex));
  }
  return this.getHibernateTemplate().findByCriteria(query);
 }

public void save(Boy boy) {
  this.getHibernateTemplate().save(boy);

 }

public void update(Boy boy) {
  this.getHibernateTemplate().update(boy);
 }

}

 

开始测试:

基于AbstractTransactionalDataSourceSpringContextTests 创建测试基类:

package com.jmesa.test.integrateTest;

import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

public class BaseDataSourceSpringContextIntegrationTest extends
  AbstractTransactionalDataSourceSpringContextTests {

//加载spring配置文件,其路径在classpath的根目录下
 private static final String[] configFiles = new String[] {
   "applicationContext-resources.xml", "applicationContext-dao.xml" };

//设置dao类的注入方式,默认为类型注入,此处改为名称注入

public BaseDataSourceSpringContextIntegrationTest() {
  this.setAutowireMode(AUTOWIRE_BY_NAME);
 }

//通过此方法提供spring配置文件

protected String[] getConfigLocations() {
  return configFiles;
 }
}

 

BoysDAO的测试类:

 

package com.jmesa.test.integrateTest;

import java.util.List;

import org.junit.Assert;
import org.junit.Test;

import com.jmesa.test.common.EntityFilters;
import com.jmesa.test.common.EntitySorts;
import com.jmesa.test.dao.BoysDAO;
import com.jmesa.test.model.Boy;

/**
 * @author   jack
 */
public class BoyDAOTest extends BaseDataSourceSpringContextIntegrationTest {
 private BoysDAO boysDAO;

public BoyDAOTest(){
 }
 /**
  * 必须要提供变量boysDAO的setter方法,这样注入才会成功
  */
 public void setBoysDAO(BoysDAO boysDAO) {
  this.boysDAO = boysDAO;
 }

@before

 public void initialize(){

 }

@after

public void destroy(){

}

@Test
 public void testGetAll(){
  int count = this.countRowsInTable("boys");
  Assert.assertEquals(boysDAO.getAll().size(),count);
 }
 @Test
 public void testQueryBoys(){
  Assert.assertEquals(0,boysDAO.queryBoys("www", "wwww").size());
  Assert.assertEquals(1,boysDAO.queryBoys("eee", "33").size());
 }
 @Test
 public void testSave(){
  int boysCount = this.countRowsInTable("boys");
  String phone ="13401108995";
  String sex = "1";
  String address = "南京路";
  Boy boy = new Boy();
  boy.setPhone(phone);
  boy.setSex(sex);
  boy.setAddress(address);
  boysDAO.save(boy);
  Assert.assertEquals(boysCount+1, this.countRowsInTable("boys")); 
 }
 @Test
 public void testGetBoysCountWithFilter(){
  EntityFilters entityFilters = new EntityFilters();
  int count = boysDAO.getBoysCountWithFilter(entityFilters);
  Assert.assertEquals(20, count);
  EntityFilters entityFilters1 = new EntityFilters();
  entityFilters1.addFilter("phone", "342432");
  int size = entityFilters1.filterSize();
  int count1 = boysDAO.getBoysCountWithFilter(entityFilters1);
  Assert.assertEquals(1, count1);
 }
 @Test
 public void testGetBoysWithFilterAndSort(){
  EntityFilters entityFilters = new EntityFilters();
  //entityFilters.addFilter("phone", "342432");
  EntitySorts entitySorts = new EntitySorts();
  entitySorts.addSort("phone", "desc");
  List<Boy> boysList = boysDAO.getBoysWithFilterAndSort(entityFilters, entitySorts, 0, 10);
  Assert.assertEquals(10, boysList.size());
  Boy boy = boysList.get(0);
  Assert.assertEquals("ww",boy.getPhone() );
  
 }

 

 

 

 

 

此处测试用到了 AbstractTransactionalDataSourceSpringContextTests 的四方面的功能:

1. 加载spring的资源配置文件

2. dao bean 引入测试类

3. 简便的函数使用,如:countRowsInTable

4. 事务自动回滚.

 

请注意此BoyDAOTest测试类中使用@before,@after修饰的方法在测试中没有被执行, 可能原因是BoyDAOTest 间接继承了TestCase类,要想执行此类方法,必须沿用以前版本的junit的setUp,tearDown

方法,然而AbstractTransactionalDataSourceSpringContextTests 类已经overide此方法,并且加了final修饰,其子类不可以在overide了. 所以加入类似before,after这样的方法,目前还没有想出比较好的办法? 还请大侠们赐教.

 

 

 

参考文献:http://www.infoq.com/articles/testing-in-spring

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    SpringBoot 多模块Dao层单元测试

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

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

    在数据库驱动的应用程序中,Dao层通常负责与数据库的交互,因此对Dao进行集成测试是非常必要的。 1. **配置Spring测试环境** 在Spring项目中,我们需要创建一个测试配置类,该类通常继承自`...

    使用junit测试ssh中的dao

    3. **注入依赖**:使用Spring的@Autowired注解将需要测试的DAO注入到测试类中。 4. **编写测试方法**:为DAO的每个关键方法编写测试用例,每个用例都应包含预期的输入和期望的输出结果。 5. **使用断言**:使用JUnit...

    spring测试示例代码

    本示例代码聚焦于使用JUnit进行Spring测试,这是一项核心的Java测试框架,广泛用于编写可重复的、独立的单元测试。 首先,让我们深入理解Spring测试的基本概念。Spring测试支持主要由`spring-test`模块提供,它包含...

    详细讲解在Spring中进行集成测试.doc

    为了进行集成测试,我们需要创建一个测试类,该类需要继承Spring的`AbstractJUnit4SpringContextTests`或使用`@RunWith(SpringRunner.class)`注解,并且使用`@ContextConfiguration`注解指定配置文件的位置。...

    Spring与Hibernate集成

    6. **测试和运行**: 最后,编写测试用例验证Spring和Hibernate的集成是否成功。运行应用,确保数据的持久化和检索功能正常工作。 在实际开发中,为了提高代码的可读性和可维护性,我们可以采用基于注解的配置和实体...

    dao.rar_spring-dao

    标题中的"dao.rar_spring-dao"暗示了这个压缩包可能包含了与Spring DAO层相关的源代码或资源。DAO(Data Access Object)模式是Java开发中常用的一种设计模式,用于封装对数据库的操作,使得业务逻辑层与数据访问层...

    基于Spring框架的在线商城系统开发

    4. 测试:单元测试和集成测试是确保代码质量的重要手段,JUnit和Mockito等工具可以帮助开发者进行有效测试。 总的来说,基于Spring框架的在线商城系统开发是一次综合性的实战练习,涵盖了Web开发的多个关键领域。...

    Spring支持DAO需要的jar包

    此外,Spring的JdbcDaoSupport类可以作为所有基于JDBC的DAO的基类,它提供了与JdbcTemplate的集成。 6. **AOP支持**:Spring的AOP模块可以创建拦截器来增强DAO方法,例如添加日志、性能监控等功能。`spring-aop.jar...

    mongoDB DAO层封装

    在这个项目中,我们主要基于MongoDB 3.0版本和Spring Data 1.5进行整合,实现了DAO层的封装。下面将详细解释这些关键知识点。 1. MongoDB MongoDB是一个流行的开源文档型数据库,它采用了NoSQL的数据模型,以JSON...

    spring与dbunit集成测试

    在软件开发中,Spring框架是Java企业级应用的主流选择,而DBUnit则...这些代码可能包含了Spring测试类的示例、数据集文件和DBUnit的使用方式。通过对这些代码的分析和学习,可以更直观地理解Spring与DBUnit的集成过程。

    Spring对于业务层的单元测试支持

    其中,Spring对于业务层的单元测试和集成测试提供了丰富的工具和功能,使得开发者能够更加高效地对代码进行验证和调试。本文将深入探讨Spring如何帮助我们进行业务层的测试。 首先,单元测试主要关注的是单个类或...

    Spring3单元测试和集成测试

    本文将深入探讨Spring3中的单元测试和集成测试,并结合DBunit这一数据库测试工具进行说明。 首先,单元测试是针对软件的最小可测试单元进行验证,通常是一个方法。在Spring3中,我们可以使用JUnit作为基础测试框架...

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

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

    省略dao层,采用全注解完成登录功能

    8. **测试**:为了确保登录功能的正确性,项目可能还包括了JUnit测试类,对Service或Controller的方法进行单元测试,确保在各种情况下都能得到预期的结果。 通过这样的设计,项目能够以更高效、更模块化的方式实现...

    spring-ssj.rar_spring_spring+Struts2+jpa集成

    9. **测试与调试**:集成完成后,进行单元测试和集成测试,确保各个部分正常工作。可以使用JUnit、Mockito等工具进行测试,同时通过日志(如Log4j)进行调试和问题排查。 通过这个小例子,开发者可以了解和掌握Java...

    SSH中通用dao类

    总结来说,"SSH中通用DAO类"是基于SSH框架设计的可复用数据访问组件,它利用Spring的DAO支持和Hibernate的ORM能力,提供了一套标准的数据库操作接口和实现,以满足多种业务需求。在实际开发中,这样的DAO设计有助于...

    web应用dao层的开发经验小结

    在Web应用程序的开发中,DAO(Data Access Object)层是一个至关重要的部分,它负责与数据库进行交互,隔离业务逻辑和数据存储的细节。本篇文章将深入探讨DAO层的设计与实现经验,结合源码分析和实用工具,以提高...

    Spring之Spring2.5集成Hibernate3.6

    不过,通常这样的文件可能会包含示例配置文件、DAO和Service类的源代码,以及可能的测试类。为了深入学习和实践这个集成,你可以尝试从其他来源获取类似项目的代码示例,或者参考Spring和Hibernate的官方文档。

Global site tag (gtag.js) - Google Analytics