今回は、LocalDateTime.now()をモック化する方法について調べていこうと思います。
環境
- Springboot2.5.x
- Gradle
- Junit5(Springboot2.2.x以降には入っている)
- Mockito(Springbootに入っている)
- Java11
- Intellij
Junit5とMockitoはSpringboot2.2.x以降であれば入っているので、別途に依存性を追加する必要はありません。
やりたいこと
サービスでLocalDateTime.now()を使っていて、now()が呼ばれたら固定値を返すようにしたいです。
調べたこと
- Junit4の場合、PowerMockとかでいけるとブログで見ましたが、Junit5との互換性が悪いので諦めました。
- Clockを「now(Clock)」のようにパラメータとして渡して、Clockをモック化する方法も見てみましたが、テストのためにビジネスロジックを変えたくなかったです。
実装
build.gradle
testImplementation 'org.mockito:mockito-inline:3.11.2'
- 上記を依存性を追加します。
- LocalDateTimeはfinalクラスなので、モック化ができないですが上記のライブラリを使うとモック化ができます。
テストコード
@Test
public void test() throws Exception {
LocalDateTime localDateTime = LocalDateTime.of(2021, 07, 10, 0, 0, 0) // ①
MockedStatic<LocalDateTime> mock = Mockito.mockStatic(LocalDateTime.class, Mockito.CLASS_REAL_METHODS); // ②
when(LocalDateTime::now).thenReturn(localDateTime); // ③
}
- ①:LocalDateTime.now()の返却値(固定値)を定義しています。
- ②:LocalDateTimeクラスをモック化しています。
- ③:LocalDateTime.now()が実行したら固定値を返すようにしています。
終わり
今回、かなり時間を使って調べましたが、Junit4のPowermockの記事が多かったです。Junit5を使ってテストを行う方に役に立てればなと思います。
