我喜欢为我的hibernate dao实现编写JUnits,并就编写这些单元测试用例的建议方法征求意见。我可以想到两个策略。
使用像EasyMock这样的库模拟hibernate模板,并针对这些模拟对象测试DAO实现。 (并不是真的令人满意,因为我将测试模拟层而不是真正反对测试数据)
在运行单元测试之前,通过编写一些测试数据来测试真实的测试数据库(内存/外部)。
哪种方法是确保我们的DAO得到适当测试的好方法。请指出使用第二种方法配置测试的任何示例。我试着环顾四周但却找不到合适的。
谢谢, 希瓦。
答案 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
}