【Kotlin/Android】MockKの使い方!モックの作成方法とテストコードの実装

この記事からわかること
- Android Studio/Kotlinで使えるMockKの使い方
- モックオブジェクトの作成方法
- verifyメソッドの使い方
\ アプリをリリースしました /
環境
- Android Studio:Koala
- Kotlin:1.9.0
- JUnit:4
- MockK:1.13.13
MockKとは?
「MockK」とはKotlin製のモックライブラリです。モックとはソフトウェアテストにおいて本物のオブジェクトや機能の代わりに動作を模倣する仮のオブジェクトのことを指します。そのモックを簡単に作成・管理するため機能を提供しています。
単体(ユニット)テストにおいてモックを使用したい場面はサーバーとのAPI通信やデータベースアクセス、外部ライブラリ依存部分などになるかと思います。テスト段階では実際の疎通を行わずにダミーの値を返却するモックを作成することでそれらに依存していた部分のコードのテストを可能にすることができます。
導入方法
Android StudioでMockKを導入するためには「build.gradle(Module:app)」にtestImplementation 'io.mockk:mockk:${mockkVersion}'
を記述します。
他にもデフォルトで色々入っているようです。
最新のバージョンは公式リリースノートを確認してください。
モックを作成してテストを実装する方法
今回はテスト自体をJUnit
を使用していきます。導入や使い方に関しては以下の記事を参考にしてください。
まず最初に登場人物をまとめておきます。クラウドデータベースから取得したデータを使用してあれこれするRootViewModel
クラスをテスト対象とする場合の想定で進めていきます。
- CloudRepository:クラウドデータベースを操作するクラス
→モックを作成するクラス - RootViewModel:CloudRepositoryから取得したデータを操作するクラス
→今回のテスト対象クラス
CloudRepository
はクラウドデータベースにアクセスを行うクラスがあると仮定します。今回はこのクラスのモックを作成したい状態になります。その場合メソッド内の処理(クラウドとの通信)はどうでもよくて引数と返り値が何かだけに注目します。
続いてテスト対象であるRootViewModel
はCloudRepositoryから取得したデータを使用して何かしらの操作するクラスと仮定します。わかりやすくするために処理は非常に簡素ですが実際はもっと複雑な処理をしていると考えてください。このクラスの持つ各メソッドの挙動をテストしたい場合はCloudRepository
に依存しているためこのままだとテストができません。テストを実行するためにCloudRepository
のモック(模倣オブジェクト)を作成することでRootViewModel
の処理ロジックのみにフォーカスを当ててテストすることができるようになります。
テストコードを作成する
では実際にRootViewModel
のテストコードクラスを実装してみます。先に全体のコードを貼っておきます。
ここで注目したいのがsetUpClass
メソッドの部分です。このメソッドの中でやっているのは以下のとおりです。@BeforeClass
などはJUnitのアノテーションなので割愛します。
- モックオブジェクトのベースを作成
- モックオブジェクトの各振る舞いにダミー値をセット
- テスト対象クラスにモックを渡す
1.モックオブジェクトのベースを作成
モックオブジェクト自体はmockk<クラス名>()
で作成することができます。この時点で作成されるのはあくまでベースのみで各振る舞いにはダミー値がありません。
2.モックオブジェクトの各振る舞いにダミー値をセット
モックオブジェクトが持つ各振る舞いにダミー値をセットするにはevery { } returns 値
を使用します。{}
ブロックで指定したメソッド(引数込み)に対しての返り値をreturns 値
で指定することができます。
3.モックオブジェクトのベースを作成
ここはMockKの関係ないところですが今回は引数で受け取る形なのでモックオブジェクトを引数に渡します。モックで作成したオブジェクトも型はCloudRepository
なので問題なく渡すことが可能です。
これで各振る舞いの定義が完了したので定義した振る舞いを使用したテストコード部分が記述、実行できるようになります。
モックを作成した場合に引数込みでダミー値を指定する必要があるので定義していない引数を使用して参照してテストを実行するとエラーになります。
verifyメソッドの使い方
MockKにはモックの振る舞いの呼び出しを検証するためのverify
メソッドが用意されています。先ほどのテストクラスにverify
メソッドを導入するためにmockRepository
変数をプロパティにしておきます。
これで各テストメソッドからモックオブジェクトを参照できるようになるのでverify
メソッドを使用していきます。verify { モックオブジェクト.メソッド }
と指定することでテストケースの中で対象モックオブジェクトメソッドがちゃんと呼ばれたかどうかを検証することが可能です。今回はテストが簡素的なので無意味ですが、複雑な分岐処理が走った場合などに適切に呼ばれているかを確認することができます。
呼び出し回数を検証
呼び出し回数を範囲で指定
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。