JUnit + Spring + Hibernate 集成测试,无法通过的问题
使用JUnit测试DAO层。由于不能破坏数据现场,故所有的测试类都继承了Spring测试框架下的org.springframework.test.AbstractTransactionalDataSourceSpringContextTests 类。继承该类,代码中对数据库的修改,在方法结束后自动回滚(当然,通过设置也可以COMMIT),并且提供了getJdbcTemplate() 方法,以便于对数据修改的测试。
如果你的DAO层的部分代码是用Hibernate来实现的,在测试时,也许会出现问题。
如,美国空间,
1 // 伪代码hibernate.add(obj); 验证Object expectedObj = getJdbcTemplate().queryForObject(obj);12 assertNotNull(expectedObj );
你会发现测试不通过。因为 expectedObj 是空值。
明明在第 5 行代码里,调用了 hibernate 的 add 方法,为什么数据库里会没有值?
想一想……
是存入数据库时出现了异常?
是查询数据库的时候条件不正确?
……
都不是。
因为 session 。
hibernate使用的session和JdbcTemplate使用的session(姑且先这么说)不是同一个。
那怎么办呢?
好办!只要在hibernate的add方法执行后,香港虚拟主机,美国服务器,加一个 flushSession 即可。
1 // 伪代码hibernate.add(obj);flushCurrentSession(); 验证Object expectedObj = getJdbcTemplate().queryForObject(obj);14 assertNotNull(expectedObj ); protected void flushCurrentSession(){ 19Session session = SessionFactoryUtils.getSession(sessionFactory, false); 20if (null != session){ 21 session.flush(); 22 } 23}
再运行JUnit看看,It’s GREEN !
Wow, so wonderful !
详细代码可参看笔者在GitHub上的代码:
https://github.com/YoungZHU/CollectionCode4Java/blob/master/test/org/young/sh/dao/OrderDAOImplTest.java
posted on
没有伞的孩子必须努力奔跑!