Junit5でstaticメソッドやコンストラクタをMock化する方法をまとめます。
準備
今回は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メソッドやコンストラクタのモック化の方法として、mockStatic
とmockConstruction
を紹介しました!
これ以外のJUnit5の実装方法についても知りたいという方はこちらの記事もご覧ください!
【Java&Kotlin】実務で使えるJUnit5テストコード
Junit4ではPowerMockを使えばよかったけど、
Junit5だとどうすればいいんだろう。