测试类通过ORMLite的DAO与DB通信

时间:2012-01-06 21:07:56

标签: java android unit-testing ormlite

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

(包含DAO调用的某些类中的方法)

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

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

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

欢迎任何建议。

2 个答案:

答案 0 :(得分:4)

我不喜欢Gray的回应,因为它让事情变得有点复杂。 我建议您只需创建内存数据库,方法是将null作为数据库名称传递:

OrmLiteSqliteOpenHelper(context,null, null, DATABASE_VERSION );

通过这种方式,您可以在单个测试中测试您的查询 a)添加模拟元素 b)测试你的SqliteOpenHelper - 包装器是否返回正确的结果

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

答案 1 :(得分:2)

槽糕。这取决于你如何创建你的Dao类。在ORMLite下,Dao类是一个接口,这意味着通过一点点布线,你应该能够注入一个模拟的DAO并只通过模拟处理查询调用。

例如,您可以在包装类sorta上使用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并绕过所有数据库操作。

希望这有帮助。