JUnit

JUnitのMockitoの@Spyを利用してMock化するメソッドを限定してみた

これまではMockオブジェクトを利用し、テスト対象クラスから呼ばれるクラスのメソッドをMock化してきたが、@Spyアノテーションを利用すると、テスト対象クラスから呼ばれるクラスの一部メソッドのみをMock化できる。

今回は@Spyアノテーションを利用したサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の「起動ポートの変更」までの手順が完了していること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

やってみたこと

  1. テスト対象プログラムの作成と実行
  2. JUnitのプログラムの作成と実行

 

テスト対象プログラムの作成と実行

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上図の赤枠は、今回記載するサンプルプログラムの内容である。

テスト対象のコントローラクラスの内容は以下の通り。



また、上記プログラムから呼び出されるコンポーネントクラスの内容は以下の通り。



さらに、画面のHTMLファイルの内容は以下の通り。

また、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下の画面が表示される。
プログラムの実行結果

なお、上記はDI(Dependency Injection)を利用している。DIについては、下記サイトを参照のこと。

Spring BootでDIを利用してみたSpringフレームワークの基本として、DI(Dependency Injection)という概念がある。 DIは日本語で「依存性...

JUnitのプログラムの作成と実行

テスト対象のコントローラクラス「DemoController.java」から呼ばれるコンポーネントクラス「DemoComponent.java」を、@Spyアノテーションを利用して一部をMock化してみたJUnitのサンプルプログラムの内容は以下の通り。

上記プログラムによって、demoComponent.getRealString1()を呼び出した際はMock化した値「mockString1」が取得でき、demoComponent.getRealString2()を呼び出した際は実際の値「realString2」が取得できる。また、void型のdemoComponent.testVoid()を呼び出した際は何もしない設定となる。



また、上記プログラムから呼ばれる、Modelオブジェクトを生成するプログラムである「DemoControllerTestUtil.java」の内容は以下の通り。

上記プログラムを実行した結果は以下の通り。
コントローラテストクラス実行結果1



同等の処理を@Mockアノテーションを利用してMock化してみたサンプルプログラムの内容は以下の通り。

上記プログラムによって、demoComponent.getRealString1()を呼び出した際はMock化した値「mockString1」が取得でき、demoComponent.getRealString2()を呼び出した際はnullが取得される。また、void型のdemoComponent.testVoid()を呼び出した際の設定は特に記載していないが、何もしない設定となる。

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

上記プログラムを実行した結果は以下の通り。
コントローラテストクラス実行結果2

要点まとめ

  • @Spyアノテーションを利用すると、テスト対象クラスから呼ばれるクラスの一部のみをMock化することができる。
  • @Spyアノテーションを付与したクラスのvoid型メソッドをMock化するには、MockitoライブラリのdoNothing()メソッドを利用する。