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 를 작성해보자.




ReflectionTestUtils 를 통해서 Mocking 하는 service 에 기간을 주입한다. 그리고 CHANGEABLE_CLOCK 을 통해서 now() 함수가 기간에 속할 때와 아닐 때로 지정하여서 올바른 값을 반환하는지 검증한다.




또 다른 방법중 하나는 Clock 을 Bean 으로 등록하고 Clock 을 Mocking 하는 것이다.




given 을 통해서 LocalDateTime.now(clock) 이 테스트 코드에서 지정한 시간으로 생성되도록 한다. 





이외에도 LocalDateTime.now static 메서드 자체를 모킹하는 방법도 있다. 하지만 기본적인 mockito 에서 static method 모킹을 지원하지 않는다. 의존성을 추가해 주어야한다. static method 를 모킹하는 방법은 코드를 유연하게 작성했는지 확인할 필요가 있다.


https://www.baeldung.com/java-override-system-time

https://www.youtube.com/watch?v=PrPQ5xHYa0s&t=608s

https://en.wikipedia.org/wiki/Coordinated_Universal_Time

댓글

이 블로그의 인기 게시물

About JVM Warm up

About idempotent

About Kafka Basic

About ZGC

sneak peek jitpack

Spring Boot Actuator readiness, liveness probes on k8s

About Websocket minimize data size and data transfer cost on cloud

About G1 GC

대학생 코딩 과제 대행 java, python, oracle 네 번째