TL;DR
Java 16
でAssertJ
のassertThat
を使ってOffsetDateTime
同士を比較するとエラーになる場合があるMockk
に関しては直接の原因じゃない?
- 原因は
JDK
内部のカプセル化の強化 Java 11
に変えるか、オプションを指定することで解決できる
本文
冒頭に書いたような状況が発生しました。
その時のスタックトレース(掲載可能な部分)は以下のようになりました。
Unable to make private static int java.time.OffsetDateTime.compareInstant(java.time.OffsetDateTime,java.time.OffsetDateTime) accessible: module java.base does not "opens java.time" to unnamed module @6515c7f6 java.lang.reflect.InaccessibleObjectException: Unable to make private static int java.time.OffsetDateTime.compareInstant(java.time.OffsetDateTime,java.time.OffsetDateTime) accessible: module java.base does not "opens java.time" to unnamed module @6515c7f6 at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) at java.base/java.lang.reflect.Method.setAccessible(Method.java:193) at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:13) at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14) at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:83) at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:20) at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:28) at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:227) at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:15) at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:42) at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16) at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:53) at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:263) at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:25) at io.mockk.proxy.jvm.advice.Interceptor.call(Interceptor.kt:20) at java.base/java.time.OffsetDateTime.compareInstant(OffsetDateTime.java:182) at org.assertj.core.internal.OffsetDateTimeByInstantComparator.compare(OffsetDateTimeByInstantComparator.java:36) at org.assertj.core.internal.OffsetDateTimeByInstantComparator.compare(OffsetDateTimeByInstantComparator.java:18) at org.assertj.core.internal.ComparatorBasedComparisonStrategy.areEqual(ComparatorBasedComparisonStrategy.java:147) at org.assertj.core.internal.Comparables.areEqual(Comparables.java:122) at org.assertj.core.internal.Comparables.assertEqual(Comparables.java:117) at org.assertj.core.api.AbstractOffsetDateTimeAssert.isEqualTo(AbstractOffsetDateTimeAssert.java:380)
対処方法としては、冒頭で書いた通り、実行するJava
をJava 11
に変えるかオプションを指定することがあります。
オプション指定に関しては、例えばgradle
だと以下のようにできます。
tasks.test { jvmArgs("--add-opens", "java.base/java.time=ALL-UNNAMED") }