使用 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 ...
随机推荐
- timesten备份和恢复
ttIsql "DSN=ttwind;UID=cacheuser;PWD=cacheuser;OraclePWD=cacheuser;" --1.查看当前版本号 Command&g ...
- 它们的定义app.config中间section节点和在执行中使用
如果现在我们需要在app.config一个节点的在下面的例子中,定义,我们需要如何进行操作? <configSections> <section name="integra ...
- js 上一天、下一天
function Previousday() { var curDate = new Date(CreateDate_Temp); * * * ); var strDate = preDate.get ...
- HDU 4791 & ZOJ 3726 Alice's Print Service (数学 打表)
题目链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...
- Linux中iptables设置详细
无论如何,iptables是一个需要特别谨慎设置的东西,万一服务器不在你身边,而你贸然设置导致无法SSH,那就等着被老板骂吧,呵呵... 一下内容是为了防止这种情况发生而写的,当然很初级,不过一般服务 ...
- 使用JavaScriptSerializer进行序列化日期类型应该注意的问题
原文:使用JavaScriptSerializer进行序列化日期类型应该注意的问题 JavaScriptSerializer在序列化DateTime时,是用刻度来表示的,具体在Json体现为:\/Da ...
- UC编程:环境变量的查询与修改
每个程序中都维护一个指向环境变量的指针char **environ; 子进程会从父进程继承环境变量.子进程环境变量的修改不一定会影响父进程 无关的多个进程之间修改环境变量不会互相影响 打印环境变量 [ ...
- HTML5表单提示placeholder属性兼容IE
placeholder 属性提供可描述输入字段预期值的提示信息(hint). 该提示会在输入字段为空时显示,并会在字段获得焦点时消失. 注释:placeholder 属性适用于以下的 <inpu ...
- wpa_cli P2P 连接相关的调试命令
在最近的一次客户端上的调试p2p的wifi display, 他们中的一半Android该调整了,整个前所以没有太多的研究p2p过程连接, 客户现在使用的非Android平台架构. 需要协助客户这么多 ...
- 读书笔记—CLR via C#委托和attribute
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...