[Mockito] Static メソッドのモック化

Javamockito,SpringBoot,UnitTest

mockito バージョン 3.4.0 から Static メソッドのモック化が可能になった。これまでは、 Static はモックできず、 PowerMock や EasyMock を別途導入する必要があった。
Static メソッドのテストの書き方をメモ。

依存追加

mockito-inline を追加する。
mockito-core のバージョンは 3.4.0 以上であること。
※ ここでは、Spring Boot Test を使っているので、 mockito-inline のみ依存に追加。

build.gradle

dependencies {
    ・・・
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation group: 'org.mockito', name: 'mockito-inline', version: '3.12.4'
}

使い方

Static メソッドのサンプル

public class StaticSample {

    // 引数なしサンプル
    public static String getName() {
        return "Hanano";
    }

    // 引数ありサンプル
    public static String getType(int type) {
    	if (type == 0) {
    	    return "typeA";
    	} else {
    	    return "typeB";
    	}
    }
}

Static メソッドのテスト

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;

public class StaticSampleTest {

    /**
     * 引数なしテスト<br>
     * try を抜けたときに、自動で close される。
    */
    @Test
    public void getNameTest_try_with_resource() {

        try (MockedStatic<StaticSample> mock = Mockito.mockStatic(StaticSample.class)) {
            mock.when(StaticSample::getName).thenReturn("Taro");
            assertEquals("Taro", StaticSample.getName());
        }
        // Static のモックは try の中だけ有効なため、↓は失敗する
        // assertThat(StaticSample.getName()).isEqualTo("Taro");
    }

    /**
     * 引数なしテスト<br>
     * ↑のtry-with-resourcesの書き方は、以下のようにも書くことができる。<br>
     * mockStatic() を呼んだら、必ず close() を呼ぶ。close しないとエラー発生。
     */
    @Test
    public void getNameTest_withClose() {

        MockedStatic<StaticSample> mock = Mockito.mockStatic(StaticSample.class);
        mock.when(StaticSample::getName).thenReturn("Taro");
        assertEquals("Taro", StaticSample.getName());
        mock.close();
    }

    /**
     * 引数ありテスト
     */
    @Test
    public void getTypeTest() {

        try (MockedStatic<StaticSample> mock = Mockito.mockStatic(StaticSample.class)) {
                mock.when(() -> StaticSample.getType(2)).thenReturn("unknown types");
                assertEquals("unknown types", StaticSample.getType(2));
        }
    }
}

・テストは、 try-with-resources の書き方と、自分で close する書き方がある。調べた感じだと、 try-with-resources の書き方の方がみたい。

・引数なしテストを引数ありテストのように、ラムダ式で書くこともできる。

Posted by Agopeanuts