mock-maker-inline - 无法初始化内联 Byte Buddy mock maker (power-mockito + jdk 8 + bytebuddy)

mock-maker-inline - Could not initialize inline Byte Buddy mock maker (power-mockito + jdk 8 + bytebuddy)

我正在使用 Powermockito 模拟和监视静态 classes。 版本:2.0.4

同时使用 mockito-core 版本 3.0.0。 在我的一个项目中,我可以通过启用此处指定的 mock-maker-inline 来 mockStatic https://github.com/powermock/powermock-examples-maven/blob/master/mockito2/src/test/resources/org/powermock/extensions/configuration.properties

但是,当我在另一个项目上尝试相同的方法时,遇到以下错误:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.ghx.tpm.api.ISubscribedProductParameterService]: Factory method 'subscribedProductParameterService' threw exception; nested exception is java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
Caused by: java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
Caused by: java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker implementation declared in sun.misc.CompoundEnumeration@614aeccc
Caused by: java.lang.IllegalStateException: Failed to load MockMaker implementation: mock-maker-inline
Caused by: java.lang.IllegalStateException: Internal problem occurred, please report it. Mockito is unable to load the default implementation of class that is a part of Mockito distribution. Failed to load interface org.mockito.plugins.MockMaker
Caused by: org.mockito.exceptions.base.MockitoInitializationException: 

Could not initialize inline Byte Buddy mock maker. (This mock maker is not supported on Android.)

Java               : 1.8
JVM vendor name    : Oracle Corporation
JVM vendor version : 25.161-b12
JVM name           : Java HotSpot(TM) 64-Bit Server VM
JVM version        : 1.8.0_161-b12
JVM info           : mixed mode
OS name            : Linux
OS version         : 4.4.0-166-generic

Caused by: java.lang.IllegalStateException: Error during attachment using: net.bytebuddy.agent.ByteBuddyAgent$AttachmentProvider$Compound@3c89bb12
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.NullPointerException 

你能帮忙解决这个问题吗?

其他详细信息:

其他发现: 通过添加 @PrepareForTest 和 PowerMockRunner 确保使用 JavassistMockClassLoader(因为我的另一个项目使用相同的配置)

正好在这一行遇到空指针异常:

ByteBuddyAgent.java (private static void install(AttachmentProvider attachmentProvider, String processId, String argument, AgentProvider agentProvider)
 Attacher.install(attachmentAccessor.getVirtualMachineType(), processId, agentProvider.resolve().getAbsolutePath(), argument);

失败的类加载器是 - AppLaunchClassLoader。 (而对于工作项目,它是 URLClassLoader)。不确定这种差异是否是一个原因。

更新二:

Eclipse IDE 通过 tools.jar 加载 mock-maker-inline(在 IDE 中工作正常) Maven 命令行通过 powermock-module-javaagent 加载 mock-maker-inline(因初始化错误而失败)。- 是否有任何建议强制 maven 控制台使用 tools.jar 进行 mock-maker-inline 初始化?

更新 3: 我采用了简约的方法。 删除了所有 Spring 运行ners、Bean 创建、上下文配置。 只是在 UUID.randomUUID() + Sysout.

上保留了一个普通的 PowerMockRunner + 静态模拟

仍然面临 mock-maker-inline 初始化错误。感觉很奇怪!! 相同的配置适用于同一工作区中的我的其他项目!

发现问题。 @PowerMockRule(利用 powermock-modules-javaagent.JAR)是罪魁祸首。

使用 @PowerMockRule 和 mock-maker-inline 导致了这个问题。

我必须用 @RunsWith(PowerMockRunner.class) 替换 PowerMockRule 来解决这个问题。谢谢

更新 1: 经过上述修复后,面临此处讨论的类加载器问题 https://github.com/raphw/byte-buddy/issues/813。 请随时分享您的建议。 谢谢

一定要选择JDK,而不是“jre”。

查看文件路径以查看它是 jdk 还是 jre。

Could not initialize plugin: interface org.mockito.plugins.MockMaker

Could not initialize inline Byte Buddy mock maker. (This mock maker is not supported on Android.)