본문 바로가기
Tips/Errors

Caused by: java.lang.reflect.InaccessibleObjectException

by 오늘의개발부 2023. 2. 16.
반응형
val testLocalTime = LocalTime.of(9,0)

mockkStatic(LocalTime::class)
every { LocalTime.now() } returns testLocalTime

 

테스트코드를 짜던 도중 LocalTime을 모킹해야 할 일이 생겼다.

 

참고로 java11, kotlin, mockk을 사용한 코드다.

 

테스트 코드를 돌려보면 에러가 뜬다.

 

Caused by: java.lang.reflect.InaccessibleObjectException

 

구글링 해보니

https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-12F945EB-71D6-46AF-8C3D-D354FD0B1781

 

Java Platform, Standard Edition Oracle JDK 9 Migration Guide, Release 9

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may

docs.oracle.com

이렇다고 한다.

 

테스트 코드를 돌릴 때만 

--add-opens=java.base/java.time=ALL-UNNAMED

옵션을 넣어줘야겠다.

 

build.gradle.kts에 추가

tasks.withType<Test>().all {
    jvmArgs("--add-opens=java.base/java.time=ALL-UNNAMED")
}

 

 

추가적으로,

LocalDateTime, Random등 외부에서 컨트롤 할 수 없는 값들은 함수 외부에서 주입받아서 사용하도록 해야 테스트 코드를 짤 때 좋은 설계라고 한다. 그런데 테스트 코드 상에서 위 값들을 컨트롤할 수 있다면 굳이 외부에서 주입받을 필요가 있을까 싶기도 하다. 

반응형