LoginSignup
4
3

More than 3 years have passed since last update.

[Android] Realmを使うDAOの単体テストの方法

Posted at

テストしっかりできるアプリを作ろうと絶賛奮闘しています。
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を使用している分、信頼性も高いと言えます。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3