JUnit

PowerMockを利用して処理途中でnewしているクラスをMock化してみた

処理途中でnewしているクラスをMock化するには、PowerMockitoのwhenNewメソッドを利用する必要がある。また、PowerMockを利用すれば、MockMakerファイルが無くても、finalメソッドをMock化できる。

今回は、PowerMockを利用して処理途中でnewしているクラスをMock化するサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の実装が完了していること。

MockitoでfinalメソッドをMock化してみたMockitoのバージョンが2の場合、MockMakerファイルを配置すれば、finalメソッドをMock化することができる。今回は、M...

作成したサンプルプログラムの内容と実行結果

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

build.gradleの内容は以下の通りで、PowerMockを利用するための設定を追加している。

また、コントローラクラスの内容は以下の通りで、DemoComponentクラスのインスタンスを生成する処理を、DemoControllerクラスのコンストラクタに移動している。

さらに、DemoComponentクラスの内容は以下の通りで、アノテーション「@Component」を削除している。

上記ソース内容で、 Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下の画面が表示される。この実行結果は、前提条件の記事と同じ内容である。
テスト対象クラスの実行結果

また、コントローラクラスのテストを行うプログラムの内容は以下の通りで、initメソッド内で、テスト対象クラスで呼ばれるクラスとそのインスタンス生成処理をMock化している。

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

DemoControllerTestクラスを実行した結果は以下の通りで、finalメソッドであるgetNowDateTimeFinalメソッドも、finalメソッドでないgetNowDateTimeメソッドも、Mock化により返却された値が設定されることが確認できる。
JUnitの実行結果

要点まとめ

  • 処理途中でnewしているクラスをMock化するには、Mock化するクラスをPowerMockでMock化し、whenNewメソッドでインスタンス化を行えばよい。
  • PowerMockを利用すれば、MockMakerファイルが無くても、finalメソッドをMock化できる。