반응형
문제
결제 엔티티에서 결제 승인 메서드를 실행하면 결제 승인 시간에 자동으로 현재 시간으로 넣어준다.
자동으로 넣어준 LocalDateTIme을 어떻게 테스트할지 궁금했는데, 특정 시간과 가까운지 테스트하는 코드가 있었다.
상황
/**
* 결제 승인
*/
public void approve() {
this.status = PaymentStatus.APPROVED;
this.approvedAt = LocalDateTime.now(); // 여기 !!!
}
결제 승인 메서드 실행 시 approvedAt에 현재 시간을 넣어준다.
해결
전체 테스트 코드
import static org.assertj.core.api.Assertions.assertThat;
// ...
@Test
@DisplayName("결제 성공")
void payment_approve() {
// given
TemporalUnitWithinOffset acceptableTimeOffset = new TemporalUnitWithinOffset(1, ChronoUnit.SECONDS);
// when
payment.approve();
// then
assertThat(payment.getStatus()).isEqualTo(PaymentStatus.APPROVED);
assertThat(payment.getApprovedAt()).isCloseTo(LocalDateTime.now(), acceptableTimeOffset);
}
각 코드 설명
TemporalUnitWithinOffset acceptableTimeOffset = new TemporalUnitWithinOffset(1, ChronoUnit.SECONDS);
TemporalUnitWithinOffset를 통해 Second 단위로 1인 범위(즉 1초 이내인지)의 객체를 생성한다.
assertThat(payment.getApprovedAt()).isCloseTo(LocalDateTime.now(), acceptableTimeOffset);
그리고 isCloseTo를 통해 현재 시간과 오프셋 이내로 차이가 나는지 확인한다.
유닛테스트라서,, 테스트가 아무리 느려도 1초가 걸리지는 않을 거라고 생각이 들어서.. 이렇게 해봤다. 컴퓨터 환경에 따라 조절하면 될 것 같다.
반응형
'TIL' 카테고리의 다른 글
TIL #115 : 자바에서 offset 있는 DateTime 파싱하기 (0) | 2024.11.13 |
---|---|
TIL #114 : Spring Security 없이 PasswordEncoder 이용하기 (0) | 2024.11.13 |
TIL #112 : 자바 애플리케이션을 도커 이미지로 만들 때 용량 줄이기 (6) | 2024.11.13 |
TIL #111 : ID를 가진 JPA 엔티티 생성 시 SELECT 문이 나가는 문제 (2) | 2024.11.11 |
24/10/04(금) 110번째 TIL : 컴포넌트 스캔 패키지 구조 문제 (0) | 2024.10.07 |