JUnit + Spring + Hibernate 集成测试,无法通过的问题

使用JUnit测试DAO层。由于不能破坏数据现场,故所有的测试类都继承了Spring测试框架下的 org.springframework.test.AbstractTransactionalDataSourceSpringContextTests 类。继承该类,代码中对数据库的修改,在方法结束后自动回滚(当然,通过设置也可以COMMIT),并且提供了 getJdbcTemplate() 方法,以便于对数据修改的测试。

 

如果你的DAO层的部分代码是用Hibernate来实现的,在测试时,也许会出现问题。

如,

 1 // 伪代码
 2 
 3 // 保存一个对象
 4 
 5 hibernate.add(obj);
 6 
 7 // 验证
 8 
 9 // 使用Spring测试框架中自带的方法 getJdbcTemplate() 到数据库中去查询这个对象 「应该」 是有值的
10 
11 Object expectedObj = getJdbcTemplate().queryForObject(obj);
12 assertNotNull(expectedObj );

 

你会发现测试不通过。因为 expectedObj 是空值。

明明在第 5 行代码里,调用了 hibernate 的 add 方法,为什么数据库里会没有值?

想一想……

是存入数据库时出现了异常?

是查询数据库的时候条件不正确?

……

 

都不是。

因为 session 。

hibernate使用的session和JdbcTemplate使用的session(姑且先这么说)不是同一个。

那怎么办呢?

好办!只要在hibernate的add方法执行后,加一个 flushSession 即可。

 1 // 伪代码
 2 
 3 // 保存一个对象
 4 
 5 hibernate.add(obj);
 6 // 新加的
 7 flushCurrentSession();
 8 
 9 // 验证
10 
11 // 使用Spring测试框架中自带的方法 getJdbcTemplate() 到数据库中去查询这个对象 「应该」 是有值的
12 
13 Object expectedObj = getJdbcTemplate().queryForObject(obj);
14 assertNotNull(expectedObj );
15 
16 
17 // 该方法可以放到一个父类里,所有的测试类都继承它
18   protected void flushCurrentSession(){  
19         Session session = SessionFactoryUtils.getSession(sessionFactory, false);  
20         if (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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值