概要
JUnit5とMockitoを使った、Calendar.getInstance()のモックの仕方について、
日本語/英語両方で調べてもなかなかヒットしなかったので記事化&サンプル用のソースを書いておきました。
1. pom.xml
を修正する
1-1. <properties></properties>
配下に下記を追加します。
<mockito.version>4.11.0</mockito.version>
1-2. <dependencies></dependencies>
の中に下記を入れます。
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
2. 実際にテストコードを記載する
実装コード
package com.example;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class DateGetter {
public String get() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
return sdf.format(Calendar.getInstance().getTime());
}
}
テスト用のコード
package com.example;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mockStatic;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
public class DateGetterTest {
@DisplayName("Calendar.getInstance()をモックするテストだよ")
@Test
void testGet() {
Calendar cal = new GregorianCalendar(2023, 1, 26, 11, 12, 13);
try (MockedStatic<Calendar> mockedCalendar = mockStatic(Calendar.class, Mockito.CALLS_REAL_METHODS)) {
// Arrange
mockedCalendar.when(() -> Calendar.getInstance()).thenReturn(cal);
// Act
String result = new DateGetter().get();
// Assert
assertEquals("20230226111213", result, "日時の期待値と結果が間違ってるよ。");
}
}
}