使用 Spring 2.5 TestContext 测试DAO层
资源准备: mysql5.0 spring-2.5 hibernate-3.2 junit-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&useUnicode=true&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>
(5)创建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); }
(6)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这样的方法,目前还没有想出比较好的办法? 还请大侠们赐教.
使用 Spring 2.5 TestContext 测试DAO层的更多相关文章
- 使用 Spring 2.5 TestContext 测试框架
Spring 2.5 TestContext 测试框架用于测试基于 Spring 的程序,TestContext 测试框架和低版本 Spring 测试框架没有任何关系,是一个全新的基于注解的测试框架, ...
- 我们应该测试 DAO 层吗?
应该测试 DAO 层吗? 网上有很多人讨论单元测试是否应该包含 DAO 层的测试.笔者觉得,对于一些主要是crud的业务来说,service层和controller层都会非常薄,而主要的逻辑都落在ma ...
- 使用Unitils测试DAO层
Spring 的测试框架为我们提供一个强大的测试环境,解决日常单元测试中遇到的大部分测试难题:如运行多个测试用例和测试方法时,Spring上下文只需创建一次:数据库现场不受破坏:方便手工指定Sprin ...
- spring boot 集成 mybatis 单元测试Dao层 控制台报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
最近帮同学做毕业程序,采用后端spring boot + mybatis + H2,将框架搭好进行各层的单元测试时,在dao层就出现了错,如图 于是在网上找各种资料,有的说是xml文件和接口没有一一对 ...
- Spring配置连接池和 Dao 层使用 jdbcTemplate
1.Spring 配置 c3p0 连接池 (1)导入jar包(Maven项目) <dependency> <groupId>com.mchange</groupId> ...
- dbunit进行DAO层Excel单元测试
DAO层测试难点 可重复性,每次运行单元测试,得到的数据是重复的 独立性,测试数据与实际数据相互独立 数据库中脏数据预处理 不能给数据库中数据带来变化 DAO层测试方法 使用内存数据库,如H2.优点: ...
- 基于dbunit进行mybatis DAO层Excel单元测试
DAO层测试难点 可重复性,每次运行单元测试,得到的数据是重复的 独立性,测试数据与实际数据相互独立 数据库中脏数据预处理 不能给数据库中数据带来变化 DAO层测试方法 使用内存数据库,如H2.优点: ...
- Spring框架之使用JdbcTemplate开发Dao层程序
简介: JdbcTemplate开发dao层程序 由Spring框架给我们提供,Spring提供的很多操作数据源(关系型数据库,二维表格模型,有明确的行和列(mysql/orcal等) 非关系 ...
- mybatis dao 层开发简易版 非整合 spring
同样老习惯,先上项目结构截图 首先 补充上篇文中缺失的 mysql demo 用的 小脚本 drop database if exists mybatis; CREATE DATABASE `myba ...
随机推荐
- 几款web版整合(QQ、msn、icq、yahoo通、Gtalk等)即时聊天http://hi.baidu.com/ejie/blog/item/e89794ef9a9431efce1b3ebd.html
直到近期为止,我们经常使用的即时聊天工具(QQ.msn等)了Web版,大家不用下载庞大软件,直接打开网页就能够与自己的好友聊天,很方便.在此将时汇总,便于大家查找,节约大家一点时间. 此都是官 ...
- nginx 开展对RT5350
编译成功nginx的mips该平台后,,至make install生成的文件到一个角落rt5350文件系统. 必须指出的是,在,被放置在文件系统中需要安装文件夹和编译一致:候有release的文件夹, ...
- 自己定义View之绘制圆环
一.RingView 自己定义的view,构造器必须重写,至于重写哪个方法,參考例如以下: ①假设须要改变View绘制的图像,那么须要重写OnDraw方法.(这也是最经常使用的重写方式.) ②假设须要 ...
- ZOJ 3802 Easy 2048 Again 像缩进DP
链接:problemId=5334">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334 题意:一个长度为5 ...
- winform屏幕截图
原文:winform屏幕截图 屏幕截图是一个比较常用的功能,在项目中出现的比例也比较高,至少我做过的每个项目都有屏幕截图这个功能,从全屏截图到区域截图都有出现过.当然区域截图已然包含了全屏截图. 全屏 ...
- 怎样选择PHP的版本
原文:怎样选择PHP的版本 IIS 如果想使用IIS配置PHP的话,那么需要选择Non-Thread Safe(NTS)版本的PHP Apache 如果你是用的Apache的版本来自Apache Lo ...
- MVC验证07-自定义Model级别验证
原文:MVC验证07-自定义Model级别验证 在一般的自定义验证特性中,我们通过继承ValidationAttribute,实现IClientValidatable,只能完成对某个属性的自定义验证. ...
- addEventListener
addEventListener addEventListener-开始 前面零散地写了些关于 addEventListener 的内容,觉得比较散,有些地方可能也说得不够清楚明白,所以决定以连载的形 ...
- Gimp教程:制作彩色的网站横幅
效果图: Step1.新建900x200的透明图层 Step2.点选画笔工具,在左下方的设置界面进行如下: 设置画笔,动态,颜色,勾选应用抖动,然后试着在图层上画一画,调节一下画笔大小,相信你能作出如 ...
- 编写Javascript类库(jQuery版
编写Javascript类库(jQuery版) - 进阶者系列 - 学习者系列文章 Posted on 2014-11-13 09:29 lzhdim 阅读(653) 评论(1) 编辑 收藏 本系列文 ...