我使用Gradle 7.5, Quarkus 2.12.3和mock 1.13.3。当我尝试从命令行运行quarkusDev
任务,然后开始连续测试(通过按r
)时,所有测试都通过OK。
然而,当我做同样的从IntelliJ(作为gradle运行配置),所有的测试失败错误:
java.lang.NoClassDefFoundError: Could not initialize class io.mockk.impl.JvmMockKGateway
我怎样才能解决这个问题?
被屏蔽抛出异常
经过多次调试,我发现了问题。抛出的异常实际上起源于HotSpotVirtualMachine.java
,并在ByteBuddy作为java代理的附件期间抛出。以下是相关代码;
// The tool should be a different VM to the target. This check will
// eventually be enforced by the target VM.
if (!ALLOW_ATTACH_SELF && (pid == 0 || pid == CURRENT_PID)) {
throw new IOException("Can not attach to current VM");
}
关闭检查
因此可以通过将ALLOW_ATTACH_SELF
常数设置为true来关闭检查。该常量是从名为jdk.attach.allowAttachSelf
的系统属性设置的:
String s = VM.getSavedProperty("jdk.attach.allowAttachSelf");
ALLOW_ATTACH_SELF = "".equals(s) || Boolean.parseBoolean(s);
因此,在我的例子中,我只是将以下JVM参数添加到gradle文件中,测试开始通过:
tasks.quarkusDev {
jvmArgs += "-Djdk.attach.allowAttachSelf"
}