<aside> 📢 목차


</aside>

0. Intro

@Entity
@EntityListeners(AuditingEntityListener.class)
public class AuthCode {

    private static final long VALID_MINUTE = 5L;

    @CreatedDate
    private LocalDateTime createdAt;

    //...

    public void verifyTime() {
        LocalDateTime expireTime = this.createdAt.plusMinutes(VALID_MINUTE);
        if (LocalDateTime.now().isAfter(expireTime)) {
            throw new InvalidAuthCodeException();
        }
    }
}

인증코드가 생성시점에서 5분이 지나면 만료되는 로직을 짜던 도중이었다.

구현 후 테스트코드를 짜려고 보니 문제가 생겼다.

Untitled

**LocalDateTime.now()** 는 시스템의 지금 시간 을 리턴하는데

어떻게 **특정 시간으로부터 만료되었는지** 검증하는 테스트 코드를 짤 수 있지? (어떻게 타임머신을 타지??)

즉, 시간 변수를 테스트에서 임의로 지정해 쓸 수 없었다.

그래서 **현재시각을 임의지정 후 모킹**해 테스트하는 방법을 생각해봤다.

1. 현재 시각을 모킹하는 법

여러가지 방법이 있었다.

  1. **Clock** 을 빈 등록해 모킹하기
  2. **LocalDateTime****static mock**으로 모킹하기
  3. **LocalDateTime.now()** 를 리턴하는 새 클래스 생성해 모킹하기