【问题标题】:Testing class communicating with DB through ORMLite's DAO测试类通过 ORMLite 的 DAO 与 DB 通信
【发布时间】:2012-01-06 21:07:56
【问题描述】:

我正在尝试采用 TDD 方法来创建 Android 应用。我正在使用 ORMLite 和 Mockito/Robolectric 进行测试。我在测试一个简单的事情时遇到了麻烦:

(某些类中封装 DAO 调用的方法)

public List<ITask> getTasksForNextTwoWeeks() throws SQLException {
    // Code to be written
}

好吧,里面的代码只是一个适当的查询方法调用。

测试该代码的最佳方法是什么?我一直在考虑这个问题,但是如果不访问真实数据库(无论是真实数据库还是测试数据库),我想不出解决方案。

欢迎提出任何建议。

【问题讨论】:

  • +1 表示 TDD 和 robolectric/mockito 组合。

标签: java android unit-testing ormlite


【解决方案1】:

我不喜欢格雷的回应,因为它让事情变得有点太复杂了。 我建议您通过将 null 作为数据库名称传递来简单地创建内存数据库:

OrmLiteSqliteOpenHelper(context,null, null, DATABASE_VERSION );

这样您就可以在单个测试中测试您的查询 a) 添加模拟元素 b) 测试您的 SqliteOpenHelper-wrapper 是否返回正确的结果

这样的每个测试都完全独立于您的实际数据库和套件中的其他测试。

【讨论】:

    【解决方案2】:

    嗯。这在一定程度上取决于您如何创建 Dao 类。在ORMLite 下,Dao 类是一个接口,这意味着通过一点连线,您应该能够注入一个模拟的 DAO,并通过模拟处理查询调用。

    例如,您可以在包装类上有一个 setDao 方法,如下所示:

    public void setDao(Dao<ITask, String> dao) {
        this.dao = dao;
    }
    
    private Dao<ITask, String> getDao() {
        if (dao != null) {
           // typical ORMLite pattern
           dao = getHelper().getITaskDao();
        }
        return dao;
    }
    

    那么您的 getTasksForNextTwoWeeks() 方法会执行以下操作:

    public List<ITask> getTasksForNextTwoWeeks() throws SQLException {
        QueryBuilder<ITask, String> qb = getDao().getQueryBuilder();
        qb.where().gt(...);
        return qb.query();
    }
    

    但这需要大量的模拟才能获得QueryBuilder

    我们所做的是扩展 ORMLIte Dao 接口并将 getTasksForNextTwoWeeks() 之类的方法添加到 ITaskDao 类。

    public interface ITaskDao extends Dao<ITask, String> {
       public List<ITask> getTasksForNextTwoWeeks() throws SQLException;
       ...
    }
    

    然后您可以轻松地模拟出ITaskDao 并绕过所有数据库操作。

    希望这会有所帮助。

    【讨论】:

    • 现在我想知道,最好将 DAO 作为一个单元进行测试,还是预先与 DB 进行集成测试。模拟 QueryBuilder 看起来过于复杂。
    • 同意。正如我所提到的,我建议您的大多数程序模拟 Dao。但是您仍然需要测试 ITaskDao 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 2016-03-08
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多