You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试使用assertThat isEqualTo时触发InaccessibleObjectException异常

Java 17下AssertJ比较XML对象时orig_second字段访问异常解决方法

问题原因

在Java 17环境中运行测试,使用AssertJ比较XML对象时抛出IntrospectionError,核心原因是Java 17的模块系统默认禁止未命名模块(AssertJ属于该模块)通过反射访问JDK内部包com.sun.org.apache.xerces.internal.jaxp.datatype中的私有字段orig_second——这个字段属于XMLGregorianCalendarImpl类。此前测试正常是因为旧版Java(如8/11)对JDK内部包的反射限制更宽松。

解决方案

方案一:添加JVM启动参数开放内部包访问

在测试的JVM参数中加入以下配置,允许未命名模块访问指定JDK内部包:

--add-opens java.xml/com.sun.org.apache.xerces.internal.jaxp.datatype=ALL-UNNAMED

方案二:自定义XMLGregorianCalendar比较逻辑

绕过AssertJ的自动字段探测,手动指定XMLGregorianCalendar的比较规则,只比较实际时间值而非内部私有字段:

assertThat(actualXmlObject)
    .usingRecursiveComparison()
    .withComparatorForType(
        (cal1, cal2) -> cal1.toGregorianCalendar().compareTo(cal2.toGregorianCalendar()),
        XMLGregorianCalendar.class
    )
    .isEqualTo(expectedXmlObject);

方案三:升级AssertJ版本

AssertJ的新版本(如3.24.0及以上)针对Java 17的模块系统做了兼容性修复,避免直接访问JDK内部私有字段。可以尝试升级AssertJ Core依赖版本。

内容的提问来源于stack exchange,提问作者curious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:22:05