テストしっかりできるアプリを作ろうと絶賛奮闘しています。
Architecture Componentsで作成しているのですが、Realmをローカルデータストアとして使用しています。
RealmのDAOをどうテストするべきか調査しました。
TLDR
androidInstrumentTestでデータをメモリに保存する設定で実際にRealmのデータを操作して単体テストを行う。
公式ドキュメントの方法
公式ドキュメントではこのサンプルプロジェクトが紹介されていました。
このプロジェクトの例では必要なクラスをPowerMockとMockitoを使ってモック化する方法がとられています。
例にあるようなrealm.createObject
を一度だけ実行するような関数のテストならこれでもいいのかもしれません。
しかしrealm.where(Hoge::class.java).limit(100).findAll()
のようなメソッドチェーンを使う場合、単純にRealm
クラスをモックにするだけではNullPointerExceptionとなってしまいます。
すべてモック化するのはRealmの内部実装も調べたりする必要が出てきそうで、トライしてみましたが途中であまり現実的でないと諦めました。
まぁ完全にモック化できればwhereが意図したように呼ばれて,limitが100を引数にとって、findAllが1回呼ばれるという部分のテストができるので理想的ではあったんですが。。
実際にRealmを使う方法
こちら の記事で紹介されていた方法。
androidInstrumentTestで実際のRealmを使う方法です。
実際のテスト対象のデータさえ準備すればテストのための準備はほとんどいりません。
メモリに保存する設定のRealm
インスタンスをデータストアにDIするくらいですかね。
記事にも書いてあるようにモックを使う方法に比べて、デバイスでテストするので少し遅くなります。
しかしそれ以上にメンテナンスが容易で、実際のRealmを使用している分、信頼性も高いと言えます。