【问题标题】:EasyMock - HibernateCallback.doInHibernate() method invocationEasyMock - HibernateCallback.doInHibernate() 方法调用
【发布时间】:2012-09-06 15:16:46
【问题描述】:


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

【问题讨论】:

    标签: hibernate easymock powermock


    【解决方案1】:

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

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

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

    Spring 有很好的 JDBC testing supportthe TestContext Framework,这使得在测试中加载 Spring 上下文并将 bean 连接到测试类中变得非常简单。

    【讨论】:

      【解决方案2】:

      mock 的规则之一是:Don't mock types you don't own

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

      【讨论】:

        猜你喜欢
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多