Spring

Spring BootでMockitoの導入方法〜使い方をまとめました

Spring Bootで、JavaのユニットテストのためのモックフレームワークであるMockitoを使ってみました。導入方法や使い方をメモしておきます。

モックって何?

テスト対象のクラス内で呼び出すクラス(依存クラス)の代替として使用するものです。例えば、テスト対象のクラスA内でBクラスのメソッドを呼び出す場合、Bクラスをモック化することで、Bクラスの中身を意識せずにメソッドの引数や戻り値を任意に設定できるのです。モックを使うことで、呼び出すクラスが完成していなくてもユニットテストを行えます。

Mockitoは、Javaでモックを使うための代表的なモックフレームワーク(ライブラリ)です。Mockitoでは、依存クラスのモック作成やメソッド呼び出しの検証、メソッドの引数検証が行えます。

環境

今回使用した環境は以下のとおりです。

Mockitoの導入方法

Spring Bootを使うのであれば、Mockitoはorg.springframework.boot:spring-boot-starter-testに含まれているので、依存性に個別にMockitoを追加する必要はありません。今回はMockitoと合わせてJUnit 5を使ったので、JUnit 5の依存性を追加しています。

build.gradle

Mockitoの使い方

ここからは実際のクラスを用いてMockitoの使い方をご紹介します。

テスト対象のクラス

クラス内でDemoRepositoryクラスを呼び出していますね。そもそもユニットテストでは、テスト対象のクラス(DemoService)にとって、クラス内で呼び出すクラス(DemoRepository)の中身を気にする必要はないのです。○○という引数を与えたら△△という戻り値が返却されることを検証すればいいのです。

ということで、DemoRepositoryクラスをモック化してテストクラスを作成してみます。

テストクラス

テストクラスの内容を補足しておきます。

  • @Mock: モック化するクラスに付与する
  • @InjectMocks: モック化したクラスをインジェクションするクラス(テスト対象のクラス)に付与する
  • MockitoAnnotations.initMocks(this): 各テストの実行前にモックオブジェクトを初期化する。アノテーションを使ってMockitoを使う場合に必要。

以下の箇所では、Mockitoのwhen/thenReturnを使って、モック化されたクラスの動作(メソッドの引数と戻り値)を設定しています。具体的には、demoRepository.findById()を引数に"001"を与えて実行した場合、戻り値としてuserを返却する設定を行っています。言葉で説明しなくてもコードを見ればやっていることが直感的にわかるかと思います。このわかりやすさもMockitoのいいところですね。

以下の箇所では、Mockitoのverifyを使って、モック化されたクラスの検証(メソッドが呼ばれた回数とメソッドの引数が正しいこと)を行っています。具体的には、demoRepository.findById()が引数"001"で1回呼び出されたことを検証しています。

Mockitoを使う上での注意点

Mockitoでは、テスト対象クラスで定義しているフィールド変数(テスト対象のクラス内で呼び出すクラス)をモック化し、それをインジェクションすることでモックの動作を設定します。つまり、以下のようにテスト対象クラス内で定義しているローカル変数はモック化できません。そのため、Mockitoを使う場合、「Mockitoを使ってテストできるかどうか」を考えてコード設計を行う必要があるのです。

まとめ

Spring BootでMockitoの導入方法〜使い方をまとめてみました。MockitoはJavaの代表的なモックフレームワークなのでぜひ使い方を覚えておきましょう。

参考リンク

-Spring

© 2024 Reasonable Code