【JUnit5】staticメソッドやコンストラクタをMock化

Junit5でstaticメソッドやコンストラクタをMock化する方法をまとめます。

Junit4ではPowerMockを使えばよかったけど、

Junit5だとどうすればいいんだろう。

準備

今回はMockitoで実現してみます。
アプリケーションはSpringBootの前提です。

spring-boot-testを利用しているとmockito自体は依存に含まれているのですが
別途mockito-inlineが必要なので依存に追加します。

dependencies {
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    // staticメソッドやコンストラクタのMock化に必要
    testImplementation 'org.mockito:mockito-inline'
}

staticメソッドのMock化

例としてLocalDateをMock化してみます。

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

import java.time.LocalDate;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mockStatic;

public class StaticMethodMock {
    @Test
    void test() {
        var mockedValue = LocalDate.of(2022, 3, 1);

        // Mock化の準備。close()の必要があるので try with resource文で
        try (MockedStatic<LocalDate> mockedLocalDate = mockStatic(LocalDate.class)) {
            // staticメソッドのMock化
            mockedLocalDate.when(() -> LocalDate.now()).thenReturn(mockedValue);

            // staticメソッドの呼び出し
            var actual = LocalDate.now();

            // 戻り値の検証
            assertThat(actual.toString()).isEqualTo("2022-03-01");

            // staticメソッドの呼び出され方の検証
            mockedLocalDate.verify(() -> LocalDate.now());
        }
    }
}

コンストラクタのMock化

例としてRandomをMock化してみます。

import org.junit.jupiter.api.Test;
import org.mockito.MockedConstruction;

import java.util.Random;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mockConstruction;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

public class ConstructorMock {
    @Test
    void test() {
        // Mock化の準備。close()の必要があるので try with resource文で
        try (MockedConstruction<Random> mockedRandom = mockConstruction(Random.class)) {
            // Mock化されたインスタンスが生成される
            var random = new Random();
            
            // Mock動作を指定(通常のMockと一緒)
            when(random.nextInt()).thenReturn(1);

            assertThat(random.nextInt()).isEqualTo(1);
            assertThat(random.nextInt()).isEqualTo(1);
            assertThat(random.nextInt()).isEqualTo(1);

            // Mock呼び出され方を検証(通常のMockと一緒)
            verify(random, times(3)).nextInt();
        }
    }
}

まとめ

staticメソッドやコンストラクタのモック化の方法として、mockStaticmockConstructionを紹介しました!

これ以外のJUnit5の実装方法についても知りたいという方はこちらの記事もご覧ください!

【Java&Kotlin】実務で使えるJUnit5テストコード

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です