본문 바로가기
Blog/TIL

2025-02-04 (화)

by 코젼 2025. 2. 4.
728x90
반응형

📝 1. Private 필드 값을 설정하는 확장 함수

  • 기존의 setPrivateField 함수를 확장 함수로 리팩토링.
  • applylet으로 변경하여 코드 가독성을 개선.

✅ 리팩토링된 코드

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

댓글