Java

SpringとJUnit(MockitoとPowerMock)で、privateなメソッドをMock化する

この記事に書いてあること

アプリケーションのテスト工程において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化することができますね!

###############お知らせ################
ブログランキングのITカテゴリに参加してみました。
この記事が役に立ったなどお力になれたら、 このバナーを押していただけると嬉しいです。

#####################################

-Java