EasyMock - HibernateCallback.doInHibernate()方法调用

时间:2012-09-06 15:16:46

标签: hibernate easymock powermock

如何从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

2 个答案:

答案 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,你可以通过编写集成测试而不是单元测试来获得更多价值。