用弹簧对hibernate daos进行单元测试

时间:2011-09-15 10:53:02

标签: hibernate unit-testing spring junit dao

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

  • 使用像EasyMock这样的库模拟hibernate模板,并针对这些模拟对象测试DAO实现。 (并不是真的令人满意,因为我将测试模拟层而不是真正反对测试数据)

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

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

谢谢, 希瓦。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

@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
}