この記事に書いてあること
アプリケーションのテスト工程においてJUnitにMockitoを組み合わせて使う場面が多いと思います。
その時よくあるのが、あるクラスをMock化して戻り値を任意の値にしたいシーンが多々あります。
それのやり方をメモ。
結論
PowerMockを使うことで解決できます。
PowerMockはMockitoを拡張したようなイメージで、基本的にはMockitoと同じ文法で使えるようになっています。
コード
pom.xml
基本的なJunitとSpringTest,Mockitoを導入しています。それと今回使用するPowerMockを取り込んでいます。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.26.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.8.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.10.22</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.2</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-testng</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
テストコード
今回はSampleLogic#execute()というprivateメソッドをMock化してみましょう。
privateメソッドであるexecute()が実行されるとExceptionをスローするようにしてみます。
SampleLogic sampleLogicImpl = new SampleLogicImpl();//一度クラスのインスタンスを生成
SampleLogic mock = PowerMockito.spy(sampleLogicImpl);//生成したインスタンスからMockを生成
// PowerMockito.doThrow(new Exception("メッセージ")).when(mock).execute(Mockito.any());//Mockitoだとこの書き方だが、PowerMockとprivateメソッドの場合は実行不可
PowerMockito.doThrow(new Exception("メッセージ")).when(mock, "execute", Mockito.any());//whenメソッドのん第2引数にMock化したいメソッド名を指定
とてもシンプルかつ簡単にMock化することができますね!