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 인스턴스에 전역인 정적 메서드를 지금 모킹을 하게 되므로 테스트를 병렬로 실행하는 동안 사용하면 결과가 일관되지 않을 수 있다.
참조
최종 수정 : 2024-04-14