728x90
반응형
📝 1. Private 필드 값을 설정하는 확장 함수
- 기존의
setPrivateField
함수를 확장 함수로 리팩토링. apply
→let
으로 변경하여 코드 가독성을 개선.
✅ 리팩토링된 코드
fun <O : Any, T> O.setPrivateField(fieldName: String, value: T) {
this::class.declaredMemberProperties
.find { it.name == fieldName }
?.javaField
?.let {
it.isAccessible = true
it.set(this, value)
}
}
📝 2. epochSecond
변환 시 LocalDateTime
이 하루 차이 나는 문제
- 원인:
toEpochMilli()
를 사용하여UTC
기준으로 변환했지만,ZoneId.systemDefault()
를 사용하면서 시스템 타임존(KST, UTC+9)으로 변환되어 날짜가 변경됨. - 해결책:
ZoneId.of("UTC")
를 사용하여 UTC 기준으로 고정.
✅ 올바른 변환 코드
val expire = Instant.ofEpochMilli(base.epochSecond.toLong()) // 🔥 밀리초 → Instant 변환
.atZone(ZoneId.of("UTC")) // ✅ UTC 고정
.toLocalDateTime()
.truncatedTo(ChronoUnit.SECONDS) // ✅ 나노초 제거
📝 3. MockKException
문제 해결 (Mock 매칭 실패)**
문제: LocalDateTime
비교 시 타임존 차이로 인해 Mock 매칭 실패
mockk
에서eq(LocalDateTime)
을 사용하면 나노초 단위 차이로 매칭 실패.matcher<LocalDateTime>()
사용해도 정확한 값이 아니면 실패.
✅ 해결책: match {}
을 사용하여 오차 범위 허용
every {
repository.logic(
eq(id), eq(email), match { it.isAfter(expire.minusSeconds(1)) }
)
} returns true
✔ match { it.isAfter(expire.minusSeconds(1)) }
→ 1초 이상 차이 나지 않으면 허용 (미세한 시간 차이 허용) ✅
✔ truncatedTo(ChronoUnit.SECONDS)
적용하여 나노초 차이 제거 ✅
728x90
반응형
'Blog > TIL' 카테고리의 다른 글
2025-02-06 (목) (2) | 2025.02.06 |
---|---|
2025-02-05 (수) (0) | 2025.02.05 |
2025-02-03 (월) (2) | 2025.02.03 |
2025-01-22 (수) (0) | 2025.01.22 |
2025-01-21 (화) (1) | 2025.01.21 |
댓글