Класс тестирования, взаимодействующий с БД через DAO ORMLite - PullRequest
5 голосов
/ 07 января 2012

Я пытаюсь использовать подход TDD при создании приложения для Android.Я использую ORMLite и Mockito / Robolectric для тестирования.Я столкнулся с проблемами при тестировании простой вещи:

(метод в некоторых классах оборачивает вызовы DAO)

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

Что ж, код внутри будет просто правильным вызовом метода запроса.

Как лучше всего протестировать этот код?Я думал об этом, но не могу придумать решение без доступа к реальной базе данных (реальной или тестовой).

Любые предложения приветствуются.

Ответы [ 2 ]

4 голосов
/ 30 июня 2014

Я не фанат ответа Грея, так как он немного усложняет ситуацию.Вместо этого я рекомендую вам просто создать базу данных в памяти, передав в качестве имени базы данных значение NULL:

OrmLiteSqliteOpenHelper(context,null, null, DATABASE_VERSION );

Таким образом, вы можете проверить свои запросы в одном тесте путем а) ​​добавления фиктивных элементов б) тестирования, если вашSqliteOpenHelper -wrapper возвращает правильные результаты

Каждый подобный тест полностью независим от вашей реальной базы данных и других тестов в вашем наборе.

2 голосов
/ 08 января 2012

Хмм. Это немного зависит от того, как вы создаете свой класс Дао. В 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 и обойти все операции с базой данных.

Надеюсь, это поможет.

...