2011-09-15 81 views
8

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

  • 使用像EasyMock这样的库嘲讽休眠模板,并测试这些模拟对象的DAO实现。 (不是真的满足,因为我会针对测试数据真的测试对一个模拟层,而不是)

  • 测试对一个真正的测试数据库(在内存/外)运行我的单元测试之前写了一些测试数据。

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

谢谢, Siva。

+1

只是想添加到augusto的评论,你可以使用DBUnit填充您的测试数据库与数据查询。 – jwmajors81

回答

5

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

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

3

针对真实数据库进行测试。 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 
}