用spring对hibernate daos进行单元测试

Posted

技术标签:

【中文标题】用spring对hibernate daos进行单元测试【英文标题】:Unit testing hibernate daos with spring 【发布时间】:2011-11-17 18:46:53 【问题描述】:

我喜欢为我的 hibernate dao 实现编写 JUnit,并就编写这些单元测试用例的建议方法征求意见。我可以想到两种策略。

使用 EasyMock 之类的库模拟休眠模板,并针对这些模拟对象仅测试 DAO 实现。 (不是很满意,因为我将针对模拟层进行测试,而不是真正针对测试数据)

通过在运行我的单元测试之前编写一些测试数据来针对真实的测试数据库(内存中/外部)进行测试。

哪种方法是确保我们的 DAO 得到正确测试的好方法。请指出有关使用第二种方法配置测试的任何示例。我试着环顾四周,但没有找到合适的。

谢谢, 湿婆。

【问题讨论】:

只是想在 augusto 的评论中添加你可以使用 DBUnit 用要查询的数据填充你的测试数据库。 【参考方案1】:

我会采用第二种方式,使用HSQLDB 作为数据库引擎。我认为调用 DAO 背后的实际实现对捕获映射错误有积极作用。

如果您的 DAO 有更多与处理休眠无关的逻辑(想象一下,如果您的 DAO 加载一些对象,然后对它们执行一些操作以返回不同的对象),我将创建一个不同的测试类来测试这些方法使用额外的逻辑,并模拟返回数据的方法。这允许您以更简单的方式设置数据,而不是启动数据库并立即加载这些对象。

【讨论】:

【参考方案2】:

针对真实数据库进行测试。 Hibernate 的大部分复杂性在于映射,如果你模拟 SessionFactory(或封装它的东西),你会完全错过测试。使用Spring Test Framework 可以大大简化您的测试,对于本地“单元”测试,可以针对内存数据库进行测试。 H2 使用简单且速度非常快(优于 HSQLDB 或 Derby)。例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("your test context.xml")
public class FooDaoTest 
    @Autowired
    private FooDao dao;

    @Transactional
    public void saveFoo_succeeds() 
        // test save
    

    @Transactional
    public void saveAndLoadFoo_resultsInSameFieldValues() 
        // save and load; compare fields from before to after
    

    // test custom queries

【讨论】:

以上是关于用spring对hibernate daos进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

DAO、Spring 和 Hibernate

Spring框架学习spring整合hibernate

框架[Hibernate]利用Hibernate进行单表的增删改查-Web实例

spring对dao层的支持

NewbieQuestion:我能以某种方式从 DAO 向 Spring+Hibernate 传递参数吗?

EJB+JPA+DAO+Hibernate/MyBatis+Spring