1


如何从 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);
}

我用谷歌搜索了它,但无法得到任何解决方案。
请建议。
谢谢。
VAm

4

2 回答 2

2

在我看来,在这样的单元测试中,尝试模拟是没有意义的HibernateTemplate,因为您的测试只会断言您以特定顺序调用某些方法 - 并且使用 DAO 源代码中存在的确切字段班级。这种类型的测试不会增加太多价值。

我认为使用真正 连接到内存 SQL 数据库的 DAO 测试要好得多HibernateTemplate,使用 DBUnit 之类的东西或仅使用外部 SQL 脚本来设置数据库中所需的“前置”条件数据。然后,您可以断言getSomeValue()返回给定数据库中数据的预期值。

这可能更多地被认为是“集成测试”,但 IMO 它比使用模拟的无用单元测试更有价值,模拟HibernateTemplate仅断言您以特定顺序调用某些方法。

Spring 具有良好的JDBC 测试支持以及TestContext 框架,这使得在测试中加载 Spring 上下文并将 bean 连接到测试类中变得非常简单。

于 2012-09-06T15:26:30.190 回答
1

模拟的规则之一是:不要模拟你不拥有的类型

如果您想测试 DAO,您将通过编写集成测试而不是单元测试来获得更多价值。

于 2012-09-06T15:22:42.267 回答