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

Lor*_*oog 5 java android unit-testing ormlite

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

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

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

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

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

欢迎任何建议.

Gra*_*ray 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;
}
Run Code Online (Sandbox Code Playgroud)

然后你的getTasksForNextTwoWeeks()方法会做类似的事情:

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

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

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

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

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

希望这可以帮助。