0. 들어가며


프로덕션 코드를 쓰다보면 LocalDateTime.now()System.currentTimeMillis() 같은 메서드를 호출하여 로직을 전개하는 경우가 더러있다. 이런 코드를 테스트하려다보니 어려움을 겪어서, 이를 해결할 수 있는 방법 중 한가지인 Clock 클래스 활용에 대해 알아보려한다.

1. 테스트가 어려운 시간 관련 코드


프로덕션 코드에서 아래와 같은 코드를 작성하고, now를 활용한 로직이 계속 나오게 되면 테스트 코드를 작성하기가 까다로워진다.

val now = LocalDateTime.now()

이 때 Clock 클래스를 활용하면 테스트를 용이하게 만들 수 있는데.. 위 코드를 아래와 같이 바꿔주면 테스트가 용이해진다.


val now = Instant.now(clock)

자세하게 어떤 방식인지는 아래에서 알아보자.

2. Clock 클래스 적용 방법


1. 스프링 빈으로 등록

전역적으로 동일한 Clock을 쓰고, 테스트에서 빈을 교체하는 방식을 활용

@Configuration
class TimeConfig {
    @Bean
    fun systemClock(): Clock = Clock.systemDefaultZone() // 호스트의 시스템 타임존 사용
}