Time Business Logic Testing on Spring (Kotlin, Java)
올해에 너무 글쓰는 것을 소홀히 했던것을 반성하며 남은 한 달 동안 글을 몇 개라도 조금 써보려고한다!
Java, Kotlin 기반 Spring 프레임워크 환경에서 개발을 하다보면 시간과 관련된 로직이 필요할 수 있다. 이 때 어떻게 해결하면 좋을 지 테스트 코드는 어떻게 구성하면 좋을지 정리하려고 한다.
예를 들어, 특정 기간동안만 액션이 가능한 요구사항이 있다고 가정하자. 해당 기간이 시작하기전에 액션을 진행하지 못하도록 막아야 되고, 기간인 경우 가능하도록 그리고 기간이 끝났을 때 더이상 액션이 불가능하도록 막아야 한다.
이 예제를 바탕으로 간단한 샘플 코드를 정리해보았다.
- Kotlin
- Spring Boot 2.7.5
- Junit 5
우선 아래와 같이 zoneId 를 인자로 받는 now 함수를 작성하였다.
CHANGEABLE_CLOKC 이 null 이 아닐경우 해당 Clock 을 기준으로 LocalDateTime 인스턴스를 생성한다.
그리고 now 를 테스트하기 위한 코드.
CHANGEABLE_CLOCK 이 null 인 경우와 null 이 아닌 경우 두 가지 테스트 케이스이다.
null 인경우에는 zoneId 에 따라서 인스턴스를 생성하기 때문에 빈 인자인 경우 UTC 기준,
Kst ZoneId 제공시 kst 시간 인스턴스를 생성하여 9시간 차이를 확인하는 코드이다.
두번 째는 Clock 을 2025 년 1월 1일로 설정하여 now 함수 호출 시 CHANGEABLE_CLOCK 기준으로 인스턴스를 생성하게 되어있다.
자 그렇다면 기간과 관련된 로직과 해당 로직을 테스트하는 코드를 작성해보자.
아래와 같이 property 에서 기간을 주입받는 Service 를 test code 를 작성해보자.
또 다른 방법중 하나는 Clock 을 Bean 으로 등록하고 Clock 을 Mocking 하는 것이다.
이외에도 LocalDateTime.now static 메서드 자체를 모킹하는 방법도 있다. 하지만 기본적인 mockito 에서 static method 모킹을 지원하지 않는다. 의존성을 추가해 주어야한다. static method 를 모킹하는 방법은 코드를 유연하게 작성했는지 확인할 필요가 있다.
https://www.baeldung.com/java-override-system-time
댓글
댓글 쓰기