クラスのmock化方法とmock化したクラスのメソッドの返り値の設定方法

  •  
 
yokoe に投稿

タグ

概要

今回は単体テスト時にテスト対象にクラスが依存しているクラスが正しく使われているかなどを検証する際やテスト対象が呼び出している別クラスのメソッドの代替して処理を行う際などに使うmockの使用方法についてサンプルと合わせてあげたいと思います。

クラスのmock化方法(モックの初期化)

テスト対象で呼び出しているメソッドのクラスや引数をモック化する際、mockメソッドを使用することでモック化することができる。
サンプルを以下に示す。

Xxx mockXxx = mock(Xxx.class);
mock化したクラスのメソッドの返り値の設定

テスト対象の動作を検証するためモック化したクラスのメソッドの返り値を設定することができる。
サンプルを以下に示します。(1,2の二通りの設定方法があります。どちらを利用してもよい)

when(mockXxx.getYyy()).thenRturn("aaa");<!-- 1 -->
doReturn("aaa").when(mockXxx).getYyy();<!-- 2 -->

テスト対象がgetYyy()を実施したとき返り値が"aaa"になる。

返り値を設定する際、複数個設定することができる。
以下のサンプルのように設定することができる。
1回目のgetYyy()の呼び出し時には"aaa"が、2回目のgetYyy()の呼び出し時には"bbb"が返り値として返される。

when(mockXxx.getYyy()).thenRturn("aaa","bbb","ccc");

また、返り値を設定する"thenRturn"以外に例外を投げる"thenThrow"がある。
設定方法のサンプルを以下に記述する。(1,2の二通りの設定方法がある。どちらを利用してもよい)

when(mockXxx.getYyy()).thenThrow(new Exception());<!-- 1 -->
doThrow(new Exception()).when(mockXxx).getYyy();<!-- 2 -->

テスト対象が返り値に例外を設定していた時に使用することができる。

mock化したクラスのメソッドの引数にMockitoのanyメソッドを用いるとメソッドに任意の引数の型の値を渡すことができる。
サンプルを以下に示す。

when(mockXxxRepository.getYyy(Mockito.any())).thenRturn(aaa);

テスト対象がgetYyy()を実施したときにanyメソッドを用いたことでgetYyy()がどんな引数で呼ばれても返り値を"aaa"になるように設定できる。
any()以外にanyString()、anyInt()を使用することができる。
anyString()の場合mock化されているメソッドの引数がnull以外のStringを指定することができる。
anyInt()の場合mock化されているメソッドの引数がnull以外のIntegerを指定することができる。
anyメソッドの引数にmock化したクラスのメソッドの特定の引数の型のクラスを指定することで指定したクラスが引数としてメソッドが呼び出されたときに設定した返り値が返される。

また、複数の引数を持つメソッドも同様にanyメソッドを複数使い設定ができる。
サンプルを以下に示す。

when(mockXxxRepository.getYyy(Mockito.any(Zzz.clas), Mockito.anyInt())).thenRturn(aaa);

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。