Kotest現在時刻インスタントリスナー(Current Instant Listeners)拡張
現在時刻インスタントリスナー(Current Instant Listeners)拡張について紹介する。
TIP
Kotest 5.6.0から、現在インスタントリスナーは`io.kotest:kotest-extensions-now:${kotest-version}`アーティファクトにある。
以下で説明する機能を使用するには、依存関係として追加する必要がある。
現在時刻インスタントリスナー
エンティティの作成日時設定など、さまざまな理由でjava.timeクラスにあるnow静的関数を使用する必要がある場合がある。
data class MyEntity(
creationDate: LocalDateTime = LocalDateTime.now()
)
しかし、その値をテストしたい場合はどうすればよいだろうか。nowを呼び出すたびに値が変わってしまう。
そのため、KotestはConstantNowListenerとwithConstantNow関数を提供している。
コードを実行している間、テストしたい値は常に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)
)
CAUTION
`withContantNow`と`ConstantNowTestListener`は競合状態に非常に敏感である。これらを使用すると、JVMインスタンス全体に対してグローバルな静的`now`メソッドをモックすることになるため、テストを並列実行している間に使用すると結果が一貫しない可能性がある。