在 Spring boot 应用程序中将mockito与mock-maker-inline一起使用时出现问题

mar*_*oss 5 mockito byte-buddy

我有一个 Spring Web 应用程序,可以在 \xe2\x80\x9cspecial\xe2\x80\x9d 模式下运行,其中使用 mockito 来监视某些对象。其中一些对象是最终的(protobuf 消息)。我知道,这可能听起来像是一个坏主意,但可以说它\xe2\x80\x99s 是一个实验。启用mock-maker-inline扩展时,可以在 I\xe2\x80\x99m 上监视最终对象,遇到似乎与字节伙伴和加载一些本机库相关的问题。当不使用扩展(并且不监视最终类)时,一切都会按预期工作。下面是截断的堆栈跟踪。

\n
java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)\n\xe2\x80\xa6\nCaused by: java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker implementation declared in sun.misc.CompoundEnumeration@60cc2b75\n\xe2\x80\xa6\nCaused by: java.lang.reflect.InvocationTargetException\n\xe2\x80\xa6\nCaused by: org.mockito.exceptions.base.MockitoInitializationException:\nCould not initialize inline Byte Buddy mock maker.\n\nIt appears as if your JDK does not supply a working agent attachment mechanism.\nJava               : 1.8\nJVM vendor name    : AdoptOpenJDK\nJVM vendor version : 25.265-b01\nJVM name           : OpenJDK 64-Bit Server VM\nJVM version        : 1.8.0_265-b01\nJVM info           : mixed mode\nOS name            : Mac OS X\nOS version         : 10.15.7\n\xe2\x80\xa6\nCaused by: java.lang.IllegalStateException: Error during attachment using: net.bytebuddy.agent.ByteBuddyAgent$AttachmentProvider$Compound@633c165e\n\xe2\x80\xa6\nCaused by: java.lang.reflect.InvocationTargetException\n\xe2\x80\xa6\nCaused by: java.lang.UnsatisfiedLinkError: Native Library /Users/\xe2\x80\xa6/.sdkman/candidates/java/8.0.265.hs-adpt/jre/lib/libattach.dylib already loaded in another classloader\n
Run Code Online (Sandbox Code Playgroud)\n

Raf*_*ter 5

这是 JVM 的一个不幸的限制,在 Java 9+ 中得到了解决。在 Java 8 中,附件库只能由单个类加载器绑定。似乎 Byte Buddy 和另一个库尝试自附加(可能是 EhCache)并绑定虚拟机 API。

您能确定其他哪些库是自附加的并可能阻止这种情况吗?