如何从DAO类创建以下方法的junit测试方法(使用EasyMock& PowerMock),
public List<MyVo> getSomeValue(final String systemId) {
//assume template set by @Resource(name = "hibernateTemplate")
HibernateCallback<List<MyVo>> callback = new HibernateCallback<List<MyVo>>() {
@Override
public List<MyVo> doInHibernate(Session session) {
Criteria criteria = session
.createCriteria(
EntityClass.class,
"main");
criteria.createAlias("AnotherName",
"ColName1");
criteria.add(Restrictions.eq("pkId",
systemId));
return template.findByCriteria(MyVo.class, criteria);
}
};
return template.execute(callback);
}
我用Google搜索,但无法获得任何解决方案。
请建议。
谢谢。
VAm
答案 0 :(得分:2)
在我看来,在这样的单元测试中,尝试模拟HibernateTemplate
是没有意义的,因为你的测试只会断言你按照特定的顺序调用某些方法 - 并且确切的字段是存在于DAO类的源代码中。这种类型的测试没有增加太多价值。
我认为使用连接到内存中SQL数据库的真实 HibernateTemplate
测试DAO要好得多,使用类似DBUnit或只需要外部SQL脚本来设置您想要在数据库中的“预”条件数据。然后,您可以断言getSomeValue()
返回给定数据库中数据的预期值。
这可能更多地被视为“集成测试”,但IMO比使用模拟HibernateTemplate
的无用单元测试更有价值,模拟{{1}}仅断言您按特定顺序调用某些方法。
Spring与JDBC testing support一起使用the TestContext Framework,这使得在测试中加载Spring上下文并将bean连接到测试类中变得非常简单。
答案 1 :(得分:1)
模仿的一个规则是:Don't mock types you don't own
如果你想测试DAO,你可以通过编写集成测试而不是单元测试来获得更多价值。