GreenDaoを使ったAndroidアプリのテストを行っています。DBUtilitiesクラスに、queryBuilderを使ったquery系のメソッドを実装していて、そのメソッドをテストしたいです。
greenrobot/greenDAOのサンプルアプリ DaoExample には、 greenDAO /DaoExample/src-test/de/greenrobot/daoexample/CustomerOrderTest.java というテストファイルがあり、insertで、実データベースではなく、メモリー上にデータを挿入しています。このサンプルでは、query系のメソッドのテストはやっていません。ググると、https://github.com/greenrobot/greenDAO/tree/master/DaoTest を参考にしろとかの情報があるのですが、そのプロジェクトの内容はかなり難解です。考えなおして、さっきのテストファイルを見なおしてみます。データを実データベースではなくメモリー上に保存するようにしているのは、どうやってかと見ます。データ挿入は、
daoSession.insert(customer);
で行っています。だけど、daoSessionは、ファイル CustomerOrderTest.java にかかれていませんね。ちょっと困惑しましたが、このクラスは、抽象クラス AbstractDaoSessionTest を継承していました。そのクラスファイルを開くと、ちゃんと、daoSessionが定義されていました。それでは、query系のメソッドレシーバーをどうやって得ればいいでしょうか。GreenDaoのドキュメントの
greenDAO – Android ORM for SQLite Introduction を読むと、次の例があります。
helper = new DaoMaster.DevOpenHelper(this, "notes-db", null); db = helper.getWritableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); noteDao = daoSession.getNoteDao();
この例では、NoteDaoインスタンスは、DaoSessionインスタンスから、getNoteDaoメソッドで得ています。そうすると、EntityがFooの場合、FooDaoインスタンスは、daoSession.getFooDao()で得られるでしょう。
さて、daoインスタンスが得られましたが、query系のメソッドのテストをどう行うでしょうか。DBUtilitesクラスのインスタンスを、AbstractDaoSessionTest を継承したテストクラスのコンストラクタで生成するとしましょう。この場合、DBUtilites のコンストラクタで、SQLiteDatabase、DaoMaster、DaoSession、CommentDao の各インスタンスを生成するような実装をしている場合、テスト実行で、実データベースにデータベースに作成されてしまいます。仕方ないので、回避策として、テストクラスファイル内に、テスト対象クラスのquery系のメソッドの実装をコピーして、fooDaoをdaoSession.getFooDao()に置き換えます。この方法で、query系のメソッドのテストが出来るようになりました。しかも、データは実データベースには保存されず、メモリー上に保存されます。