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")) // ... } }