staticなメソッドを含むクラスをMockする方法(powerMock)
javaのテストでmockする際に一般的に用いられるmockitoでは、staticメソッドがあるとMock化できないようだ。staticなメソッドが含まれるクラスをmockしようとした際に、予期せぬエラーが出たらmockitoを使っていることが原因である可能性を疑ってみよう。
staticメソッドを含むクラスをmockするためには、主に
PowerMock(staticメソッド、privateメソッド、コンストラクタなどにも対応したmockitoの強化版)
Jmockito
の二つの方法があるようだ。PowerMockの記事が多かったので、ここではPowermockを試してみた。
今のところ、junit5には完全に対応していないようなのでjunit4を使った。(2020年夏現在)
Mavenの設定
powermock-api-mockito2と、powermock-module-junit4のversionを合わせないと予期せぬエラーが出るので注意。また、mockito”2”である必要があった。
<!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito --> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>2.0.7</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4 --> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.7</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency>
使い方
@RunWith(PowerMockRunner.class) //(1) @PrepareForTest({ Example.class }) //(2) public class ExampleLogicTest { ExampleLogic logic = new ExampleLogic(); @Before public void setUp() throws Exception { PowerMockito.mockStatic(Example.class); //(3) } @Test public void countExamples() { List<ExampleDTO> result = Arrays.asList(new ExampleDTO()); when(Example.findAll()).thenReturn(result); //(4) assertThat(logic.countExamples(), equalTo(1)); } }
(1) PowerMockを使う場合に必要な宣言
(2) モック化するstaticメソッドを持つクラスを指定。複数のクラスを書くことも出来る。この記述は必須で、ないとエラーが発生する。
(3) mockする前に、どのクラスをmockするか指定。
(4)使い方はmockitoと同じ
一部のメソッドをMock化することも可能なようだ。
詳しい仕様はgithubに書いてあるので見て欲しい。