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の代表的なモックフレームワークなのでぜひ使い方を覚えておきましょう。