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に書いてあるので見て欲しい。

github.com