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 Kafka Basic

About JVM Warm up

About ZGC

Spring Boot Actuator readiness, liveness probes on k8s

About G1 GC

sneak peek jitpack

About idempotent

C 언어 구조체의 포인터 멤버 변수

Synology NAS에 MariaDB 10에 Mysql workbench로 원격접속하기

About Websocket minimize data size and data transfer cost on cloud