JUnit + Spring + Hibernate 集成测试,无法经由过程的题目
添加时间:2013-8-1 点击量:
应用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看看,Its GREEN !
Wow, so wonderful !
具体代码可参看笔者在GitHub上的代码:
https://github.com/YoungZHU/CollectionCode4Java/blob/master/test/org/young/sh/dao/OrderDAOImplTest.java
彼此相爱,却不要让爱成了束缚:不如让它成为涌动的大海,两岸乃是你们的灵魂。互斟满杯,却不要同饮一杯。相赠面包,却不要共食一个。一起歌舞欢喜,却依然各自独立,相互交心,却不是让对方收藏。因为唯有生命之手,方能收容你们的心。站在一起却不要过于靠近。—— 纪伯伦《先知》
应用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看看,Its GREEN !
Wow, so wonderful !
具体代码可参看笔者在GitHub上的代码:
https://github.com/YoungZHU/CollectionCode4Java/blob/master/test/org/young/sh/dao/OrderDAOImplTest.java
彼此相爱,却不要让爱成了束缚:不如让它成为涌动的大海,两岸乃是你们的灵魂。互斟满杯,却不要同饮一杯。相赠面包,却不要共食一个。一起歌舞欢喜,却依然各自独立,相互交心,却不是让对方收藏。因为唯有生命之手,方能收容你们的心。站在一起却不要过于靠近。—— 纪伯伦《先知》