Kotest現在時刻インスタントリスナー(Current Instant Listeners)拡張

現在時刻インスタントリスナー(Current Instant Listeners)拡張について紹介する。

現在時刻インスタントリスナー

エンティティの作成日時設定など、さまざまな理由でjava.timeクラスにあるnow静的関数を使用する必要がある場合がある。

data class MyEntity(
    creationDate: LocalDateTime = LocalDateTime.now()
)

しかし、その値をテストしたい場合はどうすればよいだろうか。nowを呼び出すたびに値が変わってしまう。

そのため、KotestはConstantNowListenerwithConstantNow関数を提供している。

コードを実行している間、テストしたい値は常にnowになる。

val foreverNow = LocalDateTime.now()

withConstantNow(foreverNow) {
    LocalDateTime.now() shouldBe foreverNow
    delay(10) // Code is taking a small amount of time to execute, but `now` changed!
    LocalDateTime.now() shouldBe foreverNow
}

または、すべてのテストに対してリスナーを使用することもできる。

override fun listeners() = listOf(
    ConstantNowTestListener(foreverNow)
)

参照