• 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

  • 相关阅读:
    图片匹配大全(转载)
    《上游》笔记
    《不可能的技艺:巅峰表现入门》笔记
    《硅谷钢铁侠》笔记
    《火线上的适应:战争时期的军事变革》笔记
    《金钱心理学:财富、贪婪和幸福的永恒教训》笔记
    流量中提取文件的若干种方法
    《重新思考:知道你不知道什么的力量》笔记
    《史蒂夫·乔布斯传》笔记
    “利润”究竟是什么
  • 原文地址:https://www.cnblogs.com/memory4young/p/junit-spring-hibernate.html
Copyright © 2020-2023  润新知