【Java】Unable to make private static int java.time.OffsetDateTime.compareInstant(java.time.OffsetDateTime,java.time.OffsetDateTime)...への対処

TL;DR

  • Java 16AssertJassertThatを使って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)

対処方法としては、冒頭で書いた通り、実行するJavaJava 11に変えるかオプションを指定することがあります。
オプション指定に関しては、例えばgradleだと以下のようにできます。

tasks.test {
        jvmArgs("--add-opens", "java.base/java.time=ALL-UNNAMED")
}

参考にさせて頂いた内容

github.com