2012-01-06 8 views
5

私はAndroidアプリを作成する際にTDDアプローチを取ろうとしています。私はORMLiteとMockito/Robolectricをテストに使用しています。ORMLiteのDAOを介してDBと通信するテストクラス

(いくつかのクラスの折り返しのメソッドアップDAO呼び出し)

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

まあ、内部のコードだけで、適切なクエリメソッド呼び出しになります:私は、単純なことをテストし、トラブルに遭遇しました。

このコードをテストする最良の方法は何ですか?私はこれについて考えてきましたが、実際のデータベース(実際のデータベースかテストデータベースかにかかわらず)にアクセスせずに解決策を考えることはできません。

+0

+1、robolectric/mockitoの場合はコンボです。 –

答えて

2

Hrm。 Daoクラスの作成方法は少し異なります。 ORMLiteの下では、Daoクラスは少しの配線で、嘲笑されたDAOを注入して模擬呼び出しを介してクエリ呼び出しを処理できるようにするインターフェイスです。

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()方法のようなものだろう:

たとえば、あなたはこのようなあなたのラップクラスみかんのsetDao方法かもしれない

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

をしかし、これは良いビットを必要としQueryBuilderを取得するための模擬テスト。

ORMLIte Daoインターフェイスを拡張し、getTasksForNextTwoWeeks()のようなメタをITaskDaoクラスに追加することです。

ITaskDaoを簡単にモックアウトし、すべてのデータベース操作をバイパスできます。

これが役に立ちます。

+0

DAOをユニットとしてテストしたり、DBと統合テストを行う方が良いのであれば、私は不思議に思っています。 Mocking QueryBuilderはオーバーコンプリートのようです。 – LordTwaroog

+0

合意。あなたのプログラムの大半は、私が言及したようにDaoを嘲笑することをお勧めします。しかし、 'ITaskDao'クラスもテストする必要があります。 – Gray

4

私はグレイの反応のファンではありません。少し複雑すぎるためです。 私は単純にデータベース名としてnullを渡すことで、代わりにインメモリデータベースを作成することをお勧めいたします:

OrmLiteSqliteOpenHelper(context,null, null, DATABASE_VERSION); 

あなたは によって単一のテストであなたのクエリをテストすることができますこの方法a)のモック要素を追加する b)のテスト場合あなたのSqliteOpenHelper - ラッパーは正しい結果を返します

あなたの実際のデータベースや他のテストから完全に独立しています。 TDDの場合は

関連する問題