気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

UTで現在時刻を扱うとき使う java.time.Clock

UTで現在時刻を扱う際の課題

現在時刻を取得するためにSystem.currentTimeMills()やLocalDateTime.now()などのstatic methodを呼び出して利用することが多いが、static methodを利用して現在時刻を取得するとテストで利用する際の時刻のスタブを用意しずらくなる。

Clockクラスを用いるとスタブを用意しやすい

static methodではなく、Clockのインスタンスメソッドを使って現在時刻を取得するため、テストでスタブを用意しやすくなる。 時間設定もfixedというメソッドがあるため、簡単に設定可能。

SpringでClockを用いるときは、BeanとしてClockインスタンスを定義しておき、利用する。

@Bean
    fun clock(): Clock = Clock.fixed(Instant.parse("2023-11-13T00:00:00.00Z"), ZoneId.systemDefault())

実装では、コンストラクタインジェクションでDIして利用。

テストでは、@MockとMockitoを利用して固定のInstantを返却する。

class SampleBeanTest {

  @MockBean
  Clock clock;
  
  @InjectMocks
  SampleBean sampleBean;
  
  @Test
  public testSample(){
  
    when(clock.instant()).thenReturn(Instant.parse("2023-11-13T00:00:00Z"))
  
    // ...
  }
}

参考URL