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

使用MockK模拟org.w3c.dom.Node时出现NoClassDefFoundError错误求助

问题分析

这个NoClassDefFoundError是因为JDK 9+的模块化系统限制了MockK代理类对java.xml模块中org.w3c.dom.Node子类的访问,再加上你使用的MockK版本(1.12.4)对模块化JDK的支持不完善,导致无法加载代理拦截器类。而JDK 8没有模块化机制,所以旧环境下代码能正常运行。

解决方案

1. 升级MockK到最新稳定版本

旧版本MockK对JDK模块化的支持存在缺陷,升级到最新版可以解决大部分兼容性问题。修改build.gradle.kts中的MockK依赖:

testImplementation("io.mockk:mockk:1.13.8") // 或更高稳定版

2. 为测试任务添加模块化访问权限(JDK 9+适用)

如果项目运行在JDK 9及以上版本,需要在Gradle测试任务中添加VM参数,解除模块化系统对相关包的访问限制:
修改tasks.test配置:

tasks.test {
    useJUnitPlatform()
    jvmArgs += listOf(
        "--add-opens", "java.xml/org.w3c.dom=ALL-UNNAMED",
        "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED"
    )
}

这些参数允许未命名模块(MockK代理类所在模块)访问org.w3c.dom包和反射相关API,确保MockK能正常生成Node的代理实例。

3. 对齐JVM版本配置

检查项目实际运行的JDK版本:

  • 如果使用JDK 8,确保IDE和Gradle的运行环境都设置为JDK 8(无需添加上述VM参数);
  • 如果使用JDK 9+,保持kotlinOptions.jvmTarget = "1.8"的同时,添加上述VM参数即可。

修改后的完整build.gradle.kts示例

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.8.0"
    application
}

group = "me.shantiswaruptunga"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1")
    implementation("javax.xml.bind:jaxb-api:2.3.1")
    testImplementation(kotlin("test"))
    testImplementation("io.mockk:mockk:1.13.8")
}

tasks.test {
    useJUnitPlatform()
    jvmArgs += listOf(
        "--add-opens", "java.xml/org.w3c.dom=ALL-UNNAMED",
        "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED"
    )
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

application {
    mainClass.set("MainKt")
}

内容的提问来源于stack exchange,提问作者Shanti Swarup Tunga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:54:54