JUnit

JUnitでMockitoを利用して処理の一部をモック化してみた

JUnitのテストを行う際、処理の一部をMock化してテストしたい場合がある。例えば、SpringBootを利用したプログラムで、データベースアクセスを行うメソッドを呼び出す場合等である。

今回は、JUnitのライブラリである「Mockito」を利用して処理の一部をMock化してみたので、そのサンプルプログラムを共有する。「Mockito」については以下を参照のこと。
https://qiita.com/yakumo3390/items/c34f1f1625c3beffaf9c

前提条件

下記記事の実装が完了していること。今回は、下記記事で作成したプログラムを利用したJUnitプログラムを作成する。

Spring BootのWEB画面上でサービスクラスを利用してみたこれまではコントローラクラスに主要な処理を記載していたが、MVCモデルに従うと、C(コントローラ)とM(モデル)で明確に分割した方が望ま...

サンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上図の赤枠のうち、「DemoServiceImplTest.java」「SexEnum.java」が今回新規で作成したプログラムとなる。



「build.gradle」は前提条件の記事と変更していない。「testImplementation ‘org.springframework.boot:spring-boot-starter-test’」という記述が含まれていることで、Mockitoライブラリも利用できる。

実際に外部ライブラリを確認すると、下図の赤枠のように、Mockitoライブラリが含まれている。
外部ライブラリのMockito

サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

また、「DemoServiceImpl.java」も、前提条件の記事と変更していない。下記ソースでは、今回テスト対象とするdemoFormListメソッドに関する部分のみを記載している。



さらに、今回作成したJUnitのプログラム「DemoServiceImplTest.java」の内容は以下の通り。

今回はMockitoを利用するため、@Beforeアノテーションが付与されているinitメソッド内で「MockitoAnnotations.initMocks(this);」を実行している。ちなみに、「@Before」アノテーションを付与したメソッドは、テストメソッド実行前に必ず呼ばれるメソッドである。

また、テスト対象のクラス「DemoServiceImpl」のオブジェクトに「@InjectMocks」を付与し、テスト対象クラス内で呼ばれるクラス「UserDataMapper」のオブジェクトに「@Mock」を付与することで、それぞれをMock化している。

さらに、テスト対象のクラス「DemoServiceImpl」のメソッド「demoFormList」内で、「UserDataMapper」クラスの「findAll」メソッドが呼ばれているため、この結果をMock化するため、initメソッド内で「when(mapper.findAll()).thenReturn(makeUserDataList());」を実行している。これで、「UserDataMapper」クラスの「findAll」メソッドが呼ばれたときに、makeUserDataList()メソッドの戻り値が返却されるようになる。



また、上記JUnitのテストプログラムで利用しているEnumクラスは、以下の通り。

なお、Enumについては、下記記事にて記載している。

JavaのEnumを利用してみたEnumはJavaの列挙型で、これを用いると、1つのEnumで複数の値をまとめて扱うことができる。Enum型をメソッドの引数に指定すると...

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/junit-mockito-mock/demo

さらに、今回作成したJUnitプログラムを実行した結果は以下の通りで、コンソールに、Mock化した、「UserDataMapper」クラスの「findAll」メソッドの戻り値を利用した結果が返却されていることが確認できる。
JUnitの実行結果

要点まとめ

  • Mockitoを利用すると、処理の一部をMock化してJUnitによるテストが行える。
  • Mockitoを利用したMockオブジェクトが利用できるためには、「MockitoAnnotations.initMocks(this);」を実行する必要がある。
  • テスト対象のクラスのオブジェクトに「@InjectMocks」を付与し、テスト対象クラス内で呼ばれるクラスのオブジェクトに「@Mock」を付与することで、Mock化が行える。
  • 「when(実行メソッド).thenReturn(戻り値);」と記述することで、実行メソッドの戻り値を設定できる。