gpt4 book ai didi

powermockito - mock-maker-inline - 无法初始化内联 Byte Buddy 模拟制造商(power-mockito + jdk 8 + bytebuddy)

转载 作者:行者123 更新时间:2023-12-02 11:16:42 28 4
gpt4 key购买 nike

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

还使用 模拟核心版本 3.0.0 .
在我的一个项目中,我可以通过启用此处指定的 mock-maker-inline 来模拟静态
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

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

额外细节:
  • 我在这里 mock 静态 spy 类(class)。
  • byte-buddy jar 解析的依赖版本是 1.9.10
  • mockito2 和 powermock-api-mockito2 的重叠会导致加载 MockMaker 时出现问题吗?如何解决它们?
  • 如果测试在 IDE 中执行,则它工作正常。但在 Maven 控制台中运行时失败。

  • 其他发现:
    通过添加 @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)。不确定这种差异是否是一个原因。

    更新 2:
  • @PowerMockRule --> 这个 Antoation 初始化 JVM 代理一次
  • 在 Mockito.mock 调用期间,它会尝试加载 mock-maker-inline,然后将 Agent 加载到 JVM 中。这会导致任何问题吗?
    我相信, VirtualMachine.attach() 方法被调用了两次。不确定它是否会导致任何问题。

  • Eclipse IDE 通过 tools.jar 加载 mock-maker-inline(在 IDE 中工作正常)
    Maven 命令行通过 powermock-module-javaagent 加载 mock-maker-inline(因初始化错误而失败)。- 有什么建议可以强制 Maven 控制台使用 tools.jar 获取 mock-maker-inline 初始化?

    更新 3:
    我采用了简约的方法。删除了所有 Spring runner、Bean 创建、上下文配置。
    只是保持了一个简单的 PowerMockRunner + UUID.randomUUID() + Sysout 上的静态模拟 .

    仍然面临 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 .
    请随时分享您的建议。
    谢谢

    关于powermockito - mock-maker-inline - 无法初始化内联 Byte Buddy 模拟制造商(power-mockito + jdk 8 + bytebuddy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60267950/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com