JUnit + Spring + Hibernate 集成测试,无法通过的问题
使用JUnit测试DAO层。由于不能破坏数据现场,故所有的测试类都继承了Spring测试框架下的 org.springframework.test.AbstractTransactionalDataSourceSpringContextTests 类。继承该类,代码中对数据库的修改,在方法结束后自动回滚(当然,通过设置也可以COMMIT),并且提供了 getJdbcTemplate() 方法,以便于对数据修改的测试。
如果你的DAO层的部分代码是用Hibernate来实现的,在测试时,也许会出现问题。
如,
// 伪代码 // 保存一个对象 hibernate.add(obj); // 验证 // 使用Spring测试框架中自带的方法 getJdbcTemplate() 到数据库中去查询这个对象 「应该」 是有值的 Object expectedObj = getJdbcTemplate().queryForObject(obj);
assertNotNull(expectedObj );
你会发现测试不通过。因为 expectedObj 是空值。
明明在第 5 行代码里,调用了 hibernate 的 add 方法,为什么数据库里会没有值?
想一想……
是存入数据库时出现了异常?
是查询数据库的时候条件不正确?
……
都不是。
因为 session 。
hibernate使用的session和JdbcTemplate使用的session(姑且先这么说)不是同一个。
那怎么办呢?
好办!只要在hibernate的add方法执行后,加一个 flushSession 即可。
// 伪代码 // 保存一个对象 hibernate.add(obj);
// 新加的
flushCurrentSession(); // 验证 // 使用Spring测试框架中自带的方法 getJdbcTemplate() 到数据库中去查询这个对象 「应该」 是有值的 Object expectedObj = getJdbcTemplate().queryForObject(obj);
assertNotNull(expectedObj ); // 该方法可以放到一个父类里,所有的测试类都继承它
protected void flushCurrentSession(){
Session session = SessionFactoryUtils.getSession(sessionFactory, false);
if (null != session){
session.flush();
}
}
再运行JUnit看看,It's GREEN !
Wow, so wonderful !
详细代码可参看笔者在GitHub上的代码:
JUnit + Spring + Hibernate 集成测试,无法通过的问题的更多相关文章
- 基于Maven的S2SH(Struts2+Spring+Hibernate)框架搭建
1. 前言 基于Maven的开发方式开发项目已经成为主流.Maven能很好的对项目的层次及依赖关系进行管理.方便的解决大型项目中复杂的依赖关系.S2SH(Struts2+Spring+Hibernat ...
- SSH面试题(struts2+Spring+hibernate)
struts2 + Spring +hibernate Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory ...
- spring+hibernate常见异常集合
spring+hibernate出错小结: (1)java.lang.NoClassDefFoundError: org/hibernate/context/CurrentSessionContext ...
- SpringMVC+Spring+Hibernate+Maven+mysql整合
一.准备工作 1.工具:jdk1.7.0_80(64)+tomcat7.0.68+myeclipse10.6+mysql-5.5.48-win322. 开发环境安装配置.Maven项目创建(参考:ht ...
- spring+hibernate+struts整合(1)
spring+hibernate:整合 步骤1:引入类包 如下图:这里是所有的类包,为后面的struts整合考虑
- SpringMVC+Spring+Hibernate的小样例
Strusts2+Spring+Hibernate尽管是主流的WEB开发框架,可是SpringMVC有越来越多的人使用了.确实也很好用.用得爽! 这里实现了一个SpringMVC+Spring+Hib ...
- Maven搭建springMVC+spring+hibernate环境
这次不再使用struts2做控制器,采用spring自己的springMVC框架实现. 首先,改写pom.xml文件,不需要struts2的相关jar了. pom.xml <project xm ...
- Maven搭建struts2+spring+hibernate环境
Maven搭建struts2+spring+hibernate环境(一) 本文简单的使用STS的自带的maven插件工具搭建ssh(struts2+spring+hibernate)开发环境,图文并茂 ...
- spring+hibernate项目demo搭建
之前用maven+spring+mybatis+spring mvc搭建了一个web项目,用于学习spring及相关知识,现在打算将mybatis换成hibernate,一样搭建一个框架. 其实myb ...
随机推荐
- boost之thread
1.boost里的thread创建之后会立即启动. 代码示例: #include <iostream> #include <string> #include <vecto ...
- UML构建模块(转载)
UML描述的实时系统,这是非常重要的一个概念模型,然后进行逐渐. UML的概念模型可以通过学习掌握以下三大要素: UML构建模块 规则连接构建模块 UML的公共机制 本章介绍了所有的UML构建块. U ...
- Apache CXF实现Web Service(3)——Tomcat容器和不借助Spring的普通Servlet实现JAX-RS(RESTful) web service
起步 参照这一系列的另外一篇文章: Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 首先 ...
- Http Url Get请求方式需要对中文参数进行编码
public static void main(String[] args) { try { String mytext = java.net.URLEncoder.encode("上海南站 ...
- 移动平台WEB前端开发技巧汇总
原文 :http://uecss.com/mobile-platform-web-front-end-development-skills-summary.html 开发者们都知道在高端智能手机系统中 ...
- 【中国互联网不眠夜】Struts2漏洞百出,OneRASP鼎力相助
Struts2是一款优秀的网站框架,在互联网上有十分广泛的应用,近期apache官方发布了高危漏洞通告Apache Struts 任意代码执行漏洞(CVE-2016-3081,S2-032),该漏洞风 ...
- ZOJ3229 Shoot the Bullet(有源汇的上下界最大流)
#pragma warning(disable:4996) #include <iostream> #include <cstring> #include <string ...
- cf div2 238 c
C. Unusual Product time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- test1
test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1test1 ...
- 在Vista或Windows 7系统上安装Sharepoint 2007
在Vista或Windows 7系统上安装Sharepoint 2007 2010-03-05 18:53:19| 分类: 技术文章|字号 订阅 SharePoint 2007 不能直接安装 ...