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 ifnull != 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

    彼此相爱,却不要让爱成了束缚:不如让它成为涌动的大海,两岸乃是你们的灵魂。互斟满杯,却不要同饮一杯。相赠面包,却不要共食一个。一起歌舞欢喜,却依然各自独立,相互交心,却不是让对方收藏。因为唯有生命之手,方能收容你们的心。站在一起却不要过于靠近。—— 纪伯伦《先知》
    分享到: