无法初始化插件:接口 org.mockito.plugins.MockMaker

Posted

技术标签:

【中文标题】无法初始化插件:接口 org.mockito.plugins.MockMaker【英文标题】:Could not initialize plugin: interface org.mockito.plugins.MockMaker 【发布时间】:2017-06-16 20:05:37 【问题描述】:

一旦开始测试,我就会收到以下异常:

    Testcase: treeCtorArgumentTest(com.xythos.client.drive.cachedtree.CachedTreeTest):  Caused an ERROR
Could not initialize plugin: interface org.mockito.plugins.MockMaker
java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker
    at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:66)
    at com.sun.proxy.$Proxy7.isTypeMockable(Unknown Source)
    at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29)
    at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22)
    at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:168)
    at org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:162)
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:64)
    at org.mockito.Mockito.mock(Mockito.java:1687)
    at org.mockito.Mockito.mock(Mockito.java:1600)
    at com.xythos.client.drive.cachedtree.CachedTreeTest.setUp(CachedTreeTest.java:51)
Caused by: java.lang.NoClassDefFoundError: net/bytebuddy/dynamic/loading/ClassLoadingStrategy
    at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.<init>(SubclassByteBuddyMockMaker.java:33)
    at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.<init>(ByteBuddyMockMaker.java:22)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:54)
    at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:18)
    at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:17)
    at org.mockito.internal.util.MockUtil.<clinit>(MockUtil.java:24)
Caused by: java.lang.ClassNotFoundException: net.bytebuddy.dynamic.loading.ClassLoadingStrategy
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

这是我的测试:

package com.xythos.client.drive.cachedtree;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)

    public class CachedTreeTest 

        public CachedTreeTest() 
        

        @Test
        public void treeCtorArgumentTest() 
        somemock m = mock(SomeClass.class);
        
    

我使用的是 NetBeans 8.2。我已经下载了mockito-core-2.7.0.jar,然后我选择“Test Libraries”->“Add Jar”并添加了mockito-core-2.7.0.jar。

类路径,一切看起来都不错,但我仍然遇到异常。

有什么建议吗?

【问题讨论】:

在***.com/a/41964561/4903889查看解决方案 升级到新版本的 Mockito 帮助我解决了这个问题。 清除 Gradle 缓存并从头开始下载所有依赖项为我修复了它。 (请参阅:***.com/a/13567793/4568679 清除缓存) 我在文件src/test/resources/org/powermock/extensions/configuration.properties 中有错字,导致出现异常。 【参考方案1】:

如果您使用 powermock,请确保您的依赖项指向:

org.powermock:powermock-api-mockito2

而不是

org.powermock:powermock-api-mockito

【讨论】:

我还不知道确切的原因,但是当我将 Spring 版本 1.5.14-RELEASE 升级到 2.0.4-RELEASE 后测试失败时,这个答案对我有所帮助 这个问题与powermock无关。当您使用 jre 而不是 jdk 时会出现问题。 我没有使用 PowerMock 如果您不使用 PowerMock?该问题确实引用了接口 org.mockito.plugins.MockMaker。【参考方案2】:

缺少参考:

byte-buddy-1.6.5.jar byte-buddy-agent-1.6.5.jar objenesis-2.5.jar

从 Mockito 2.0.2 beta 开始,Mockito-core 有了依赖关系。

【讨论】:

默认包含这些库,这不是解决方案 我可以确认将最新的 byte-buddy(更有可能是 byte-buddy-agent)JAR 添加到“最新最好的”mockito 设置帮助中。对我来说,问题的例外是在使用 mockito 2 启用“模拟最终”类后出现的。 这些是传递依赖项,您不必显式添加它们。 对于 mockito 2.25.1,您只需要 objenesis-3.0.1.jarbyte-buddy-1.9.12.jar 这些部门也在页面底部的maven page 中列出。包含它可以解决问题。【参考方案3】:

我在类路径上有 Byte Buddy(是 Mockito 2.8.9 的传递 dep),但仍然出现异常。我的原因是我使用 JRE 而不是 JDK 运行单元测试。切换到 JDK 对我有用。

【讨论】:

你是如何改变这个的? @TaranmeetSingh 如果您使用的是 android Studio,请转到文件 > 项目结构 > SDK 位置,并检查您的 JDK 的路径是否正确。 (如果您还没有从 Oracle 网站下载 JDK,则需要下载。) 嗨@LydiaRalph 感谢您的建议,实际上我遇到了一个完全不同的问题。我正在为其中一个模块(也是独立的 android studio 项目)编写单元测试用例,但我却在 android studio 中打开了整个项目。切换到独立项目为我解决了这个问题。 @Stefano ,如何切换,因为我没有提到任何使用 jdk 或 jre 的地方 这为我解决了问题。我刚刚从 Eclipse 的 Java 运行时中删除了 JRE,只留下了 JDK。【参考方案4】:

如果您启用模拟最终类的选项,则 Mockito2 会出现此问题。

这意味着在您的 test/resources/mockito-extensions 目录中 你有一个名为 org.mockito.plugins.MockMaker 的文件 以下内容mock-maker-inline

在这种情况下,作为 mockito-core 的传递依赖项的 byte-buddy 存在将自己的代理附加到 java 进程的问题。但是只有在使用 JRE 时才会出现问题。

解决方案是:

使用 JDK 而不是 JRE

添加 -javaagent:byte-buddy-agent-*.jar 作为 VM 选项

【讨论】:

在 Android Studio 中如何检查是否使用 JRE 而不是 JDK,以及如何更改它? 我对 Android Studio 也有同样的问题。有人成功了吗? 仍然看到这个问题怎么办?【参考方案5】:

我遇到了同样的问题 - 我的日志中出现了相同的堆栈跟踪。这通常是项目设置的问题...或者如果未正确下载这些 JAR,问题可能出在 bytebuddys JAR 中。 当我尝试手动检查 ClassLoadingStrategy 类时,我得到了压缩错误。

在这种情况下,从本地 maven 目录手动删除 Byte Buddy 就足够了,通常位于:home/.m2/repository/net/bytebuddy/ 下次尝试运行项目或测试时,它们将再次下载并按预期工作。

不幸的是,当类或 jar 丢失以及 jar 损坏时,常见的 Java ClassLoader 面临同样的问题。

【讨论】:

还有一种可能:Hibernate 也有 net.bytebuddy* 作为依赖,所以可能依赖相互冲突。【参考方案6】:

好吧,经过大量研究,对我来说解决方案非常简单:

将 Mockito 库版本更新到最新版本

dependencies 
    testImplementation 'org.mockito:mockito-core:3.10.0'
    androidTestImplementation 'org.mockito:mockito-android:3.10.0'

【讨论】:

【参考方案7】:

问题:PowerMock + Mockito + TestNG + PowerMockTestCase

分享我的问题/解决方案以防万一。

我的依赖项都指向正确:

testImplementation 'org.mockito:mockito-core:2.8.47'
testImplementation 'org.powermock:powermock-core:1.7.4'
testImplementation 'org.powermock:powermock-module-testng:1.7.4'
testImplementation 'org.powermock:powermock-api-mockito2:1.7.4'

但我仍然收到以下错误:

java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker

    at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:66)
    at com.sun.proxy.$Proxy11.isTypeMockable(Unknown Source)
    at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29)
    at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22)
    at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:186)
    at org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:180)
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:62)
    at org.mockito.Mockito.mock(Mockito.java:1729)
    at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:33)
    at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)
    at org.mockito.internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:38)
    at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:62)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:57)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:41)
    at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:69)

我的测试是这样的:

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import static org.mockito.MockitoAnnotations.initMocks;

@PrepareForTest(MyClass.class)
public class MyTest extends PowerMockTestCase 

    @BeforeTest
    public void init() 
        initMocks(this);
    

正如这个线程中提到的,删除initMocks() 方法会删除错误,但所有的模拟都变为空。


✅解决方案:BeforeTest VS BeforeMethod

我发现我的案例是@BeforeTest 实际上是一个问题。 将其更改为 @BeforeMethod 解决了错误。

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import static org.mockito.MockitoAnnotations.initMocks;

@PrepareForTest(MyClass.class)
public class MyTest extends PowerMockTestCase 

    @BeforeMethod // CHANGE THIS!
    public void init() 
        initMocks(this);
    

我的猜测是它与 bean 注入有关; @BeforeTest 在注入任何 bean 之前执行,而 @BeforeMethod 在 bean 注入之后执行。不知道它是如何真正影响的。

【讨论】:

你有没有powermock的解决方案? @portfoliobuilder 如果您不使用 powermock,我认为您不会遇到与我相同的问题。也许你可以仔细检查这个线程上给出的其他建议?确保 mockito 已更新,您使用的是 jdk 并且没有缺少的引用。【参考方案8】:

对于 android 开发,您需要导入一些东西:

 dependencies 
   testCompile "org.mockito:mockito-core:+"
   androidTestCompile "org.mockito:mockito-android:+"
 

找不到任何参考,但这是唯一对我有用的参考。

【讨论】:

【参考方案9】:

我遇到了这个问题,并通过将我的 org.mockito.mockito-core 版本升级到最新版本来解决它。我使用旧版本已经有一段时间了。

【讨论】:

【参考方案10】:

就我而言,我正在处理一个不使用 maven 构建系统的项目。所以这对我有用。

导航到 mockito 的 maven 存储库(使用 v2.26):https://mvnrepository.com/artifact/org.mockito/mockito-core/2.26.0。我下载了 jar。 在底部的同一页面上,我查找了依赖项。对于 mockito 2.26.0,这些依赖项是: 字节好友v.1.9.10 (https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy/1.9.10) 字节好友 Java 代理 v1.9.10 (https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy-agent/1.9.10) 对象 v2.6 (https://mvnrepository.com/artifact/org.objenesis/objenesis/2.6) 我下载了上述 mockito 依赖项的 jar 文件 在 Eclipse 中,我创建了一个包含四个 jar 文件的用户库,并将其添加到我的项目中。

注意:(创建库是可选的,您可以将 jar 直接添加到项目构建路径中)

希望这对某人有所帮助。

【讨论】:

【参考方案11】:

从错误中出现的 maven 存储库路径中手动删除“byte-buddy-1.7.11.jar”。 Maven 更新项目,问题将得到解决。尝试并为我工作。

【讨论】:

【参考方案12】:

Mockito 2 需要依赖项。在下面添加两个 ByteBuddy 依赖项。为我解决了这个问题:

byte-buddy-x.x.xx.jar byte-buddy-agent-x.x.xx.jar

在我的例子中,我在项目中包含了 jar 文件,可以在以下位置找到: https://bintray.com/raphw/maven/ByteBuddy/

如果您在 Maven 项目中需要它,只需添加:

<dependency>
  <groupId>net.bytebuddy</groupId>
  <artifactId>byte-buddy</artifactId>
  <version>1.9.14</version>
  <type>pom</type>
</dependency>

【讨论】:

【参考方案13】:

我通过删除 POM XML for Maven 中的 jmockit 解决了这个问题。之后我的 Junit 5 测试完美运行。

    <dependency>
        <groupId>org.jmockit</groupId>
        <artifactId>jmockit</artifactId>
        <version>1.41</version>
        <scope>test</scope>
    </dependency>

有了这个依赖,我总是会收到如下错误:

java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
...

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

Caused by: com.sun.tools.attach.AttachNotSupportedException: no providers installed
...

【讨论】:

【参考方案14】:

对我来说,问题在于 IntelliJ 将测试作为集成测试运行。所以我需要手动创建 JUnit 测试

【讨论】:

也许你在androidTest目录下有这个单元测试?我认为 AS 期望在“androidTest”中进行仪器测试,在“test”中进行单元测试。【参考方案15】:

在我的情况下,删除mockito-core 后,测试成功了!

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>$mockito.version</version>
    <scope>test</scope>
</dependency>

我的版本在这里,JDK是1.8.0_121。

<properties>
    <powermock.version>2.0.7</powermock.version>
    <mockito.version>2.8.9</mockito.version>
</properties>

现在我的依赖是:

powermock-api-mockito2 powermock-module-junit4

【讨论】:

【参考方案16】:

您可能在手动向项目中添加依赖项时遇到问题。记下项目中使用的 mockito-core jar 版本。

访问这个 mvn 存储库链接

https://mvnrepository.com/artifact/org.mockito/mockito-core/replace-with-your-mockito-core-version

移至 mvn 存储库页面下方的编译依赖项部分,下载 mockito-core 需要的所有适当版本的依赖项。

在回答这个问题时:

字节好友

字节好友代理

目的

将所有内容与 mockito-core 一起添加到项目中并运行测试。

【讨论】:

【参考方案17】:

在我的情况下,一些异常的环境设置也会导致这个错误:

在 ubuntu 16.04 中,java 和 javac 已更新为 7 但是 $JAVA_HOME 被错误地设置为 8

我删除了$JAVA_HOME,一切恢复正常

【讨论】:

【参考方案18】:

为此添加一个 bnd 方面

除了Paskas' answer,如果您使用的是依赖项,还必须在 cnf maven 存储库中包含依赖项(例如我的cnf/central.mvn)。

org.mockito:mockito-core:2.21.0
net.bytebuddy:byte-buddy:1.8.15
net.bytebuddy:byte-buddy-agent:1.8.15
org.objenesis:objenesis:2.6

为了方便引用,您可以在 cnf/build.bnd 中包含一个 bnd 变量

mockito: org.mockito:mockito-core; version=2.21.0,\
         net.bytebuddy:byte-buddy; version=1.8.15,\
         net.bytebuddy:byte-buddy-agent; version=1.8.15,\
         org.objenesis:objenesis; version=2.6

在你项目的 bnd 文件中

-testpath:\
    $mockito

【讨论】:

【参考方案19】:

我在一个现有项目中遇到了同样的问题。 我使用了 java 8 并另外安装了 java 10。 所以我开始得到这个例外。 我卸载了java 10,它没有帮助。 我从 maven repo 中删除了 bytebuddy jar,它没有帮助。 只有从 maven repo 中完全删除所有 jars 后,我才能再次编译项目。

【讨论】:

【参考方案20】:

删除版本声明对我有用:

例子:

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>2.8.9</version>
        <scope>test</scope>
    </dependency>

删除 2.8.9

之后:

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <scope>test</scope>
    </dependency>

可能是这个依赖的jar包之间的版本问题。

【讨论】:

您肯定会继承该版本,因为删除它会破坏项目。错误所以错误的答案。【参考方案21】:

不是原始海报的答案,因为他/她使用的是 Netbeans,但在 Eclipse 中,我需要执行“Maven -> 更新项目”才能让测试再次运行。

【讨论】:

【参考方案22】:

在我从 $home.m2\repository\net\bytebuddy 中删除 bytebuddy 文件夹并从 pom.xml 中删除 byte-buddy-agent、byte-buddy 和 objenesis 依赖项后,它对我有用

【讨论】:

【参考方案23】:

我遇到了同样的问题,通过在存储库和 mockito 依赖项中添加 jcenter 得到了解决。

repositories 
    jcenter()
 
 dependencies 
    testImplementation 'org.mockito:mockito-core:3.7.7'
    testImplementation 'org.powermock:powermock-core:1.7.4'
    testImplementation 'org.powermock:powermock-module-testng:1.7.4'
    testImplementation 'org.powermock:powermock-api-mockito2:1.7.4'
 

【讨论】:

JCenter 现在是 end of life,截至 2021 年 5 月 1 日。【参考方案24】:
    androidTestImplementation 'org.mockito:mockito-core:2.19.0' 
testImplementation "org.mockito:mockito-core:2.19.0"//game changer for your question

这第二行改变了游戏规则,android 测试实现和测试实现不是同一个测试集(android 测试实现是物理设备或模拟器的测试集)... 您可能对一个和编写代码有依赖关系,但是如果您运行不同的测试(在没有模拟器的 android studio 中本地)它将失败(除非..:)

快乐测试

【讨论】:

【参考方案25】:

就我而言,删除:

home/.m2/repository/org/robolectric/

解决了这个问题。下次运行时,它会再次下载这些文件。

【讨论】:

【参考方案26】: PowerMock 第一步不支持 sonar,问题的原因是 powermock 和 jacoco 的组合 我们本地不会遇到这个问题,但是如果我们使用sonar进行测试覆盖率计算,报错如下
Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null) 
在 PowerMock 2.0.9 版本中,提供了解决此问题的方法,前提是他们添加了注释 @PrepareOnlyThisForTest,这提供了隔离特定测试类的能力。 除此之外,我们还需要使用 @PowerMockRunnerDelegate(SpringRunner.class) 将 Runner 委托给 SpringRunner

在 pom.xml 中添加 Power Mock 依赖项

        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>2.0.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito2</artifactId>
            <version>2.0.9</version>
            <scope>test</scope>
        </dependency>

使用 PowerMock Junit Runner 进行测试类并声明我们正在模拟的测试类并委托 SpringRunner

    @RunWith(PowerMockRunner.class)
    @PrepareOnlyThisForTest(ServiceApplication.class)
    @PowerMockRunnerDelegate(SpringRunner.class)
    public class ExampleControllerTest 
        PowerMockito.mockStatic(ServiceApplication.class);
        Mockito.when(ServiceApplication.getStatic()).thenReturn("");

【讨论】:

【参考方案27】:

我遇到了同样的问题,终于解决了。

这是一个很长的答案,但如果你在这个问题上挣扎了一段时间,希望这可以帮助你。


这是我的场景。

Android 单元测试

依赖

->org.mockito:mockito-core()

-> org.powermock:powermock-api-mockito2(模拟静态类)

-> mockito-inline(启用最终类模拟)

->com.nhaarman.mockitokotlin2:mockito-kotlin


根本原因 -> 检查错误日志

Issue1 -> Tools.jar 依赖丢失

为了使用mock-maker-inline (mockito-inline),它有依赖 在 Tools.jar 上。我们需要依赖。

这里是link

我的错误日志如下所示

java.lang.RuntimeException: Invoking the beforeTestMethod method on PowerMock test listener org.powermock.api.extension.listener.AnnotationEnabler@49a4bf9a failed.

...

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@3d529098

            ...

            Caused by:
                java.lang.reflect.InvocationTargetException

                ...

               Caused by:
                    org.mockito.exceptions.base.MockitoInitializationException: 
                    Could not initialize inline Byte Buddy mock maker.
                    ...

                    Caused by:
                                java.lang.NullPointerException
                                    at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:182)

所以你可以看到最后一行是attachProvider throw NullPointerException,这个attachProvider 存在于 tools.jar 中

类路径是com.sun.tools.attach.AttachProvider

所以我们需要为tools.jar添加依赖


Issue2 -> 为tools.jar 添加了错误的依赖项

我为 tools.jar 添加了错误的依赖项,使用 MacOS tools.jar 作为依赖项。

但是我们的构建机器是 Linux 平台,所以我在 diff 错误日志中得到了这个错误。

Cause JDK has different version with different platforms (MacOS, Linux, Windows)
based on the different platforms `VirtualMachine` has diff implementation (MacOS, Linux, Windows) 

这是错误日志

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@3d529098

            ...

            Caused by:
                java.lang.reflect.InvocationTargetException

                ...

               Caused by:
                    org.mockito.exceptions.base.MockitoInitializationException: 
                    Could not initialize inline Byte Buddy mock maker.
                    ...

                    Caused by:
                                java.lang.UnsatisfiedLinkError: sun.tools.attach.BsdVirtualMachine.getTempDir()Ljava/lang/String;
                                    at sun.tools.attach.BsdVirtualMachine.getTempDir(Native Method)
                                    at sun.tools.attach.BsdVirtualMachine.<clinit>(BsdVirtualMachine.java:308)
                                    at sun.tools.attach.BsdAttachProvider.attachVirtualMachine(BsdAttachProvider.java:63)
                                    at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208)


您可以在这里看到,VirtualMachine 找到了 AttachProvider (BsdAttachProvider) 但之后它抛出了异常。

也就是说我们添加了依赖,但是依赖是错误的。


如何正确添加tools.jar依赖

(1) 将tools.jar 文件添加到lib 文件夹(错误)

add this `testImplementation fileTree(dir: 'libs', include: ['tools.jar'])` in the gradle file

this is not a good approach, cause our build machine (remote) may use the Linux system, but our local machine (Laptop, PC) may use the MacOS or Windows.

this will cause the Issue2  which I mentioned above

(2) 在 gradle 文件中添加 testImplementation files(org.gradle.internal.jvm.Jvm.current().toolsJar)。 (错误)

this one will throw NullPointerException after gradle 4.X.

(3) 在gradle文件中添加testImplementation files("$System.properties['java.home']/../lib/tools.jar")

it will trying to read the environment virable to get the path for the `tools.jar`

Cause both build machine (remote) and local machine (Laptop, PC) need to configure the JDK to make it work.

So this approach should find it's own path even it's based on diff platform (MacOS, Linux, Windows)

This is the approach I am using, If you have better one, please let me know.

配置 Android Studio JDK 位置

不要将 Android Studio 应用程序文件夹用作 JDK 位置。

使用JAVA_HOME 变量路径作为JDK 位置。 (可以在终端输入echo JAVA_HOME

否则在运行单元测试时会显示此错误

Transform's input file does not exist: /Applications/Android Studio.app/Contents/jre/jdk/Contents/lib/tools.jar.

因为它的 Android Studio Application JDK 文件夹没有tools.jar 文件。 (可以对比一下正常配置的JDK文件夹和Android Studio Application Package一)

/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home

完成这些步骤后,您应该可以运行单元测试了。

如果你在运行单元测试时得到这个org.mockito.exceptions.misusing.NotAMockException

请确保 mocktio-inline 配置正确。

问题链接 (https://github.com/powermock/powermock/issues/992)

基于 mockito 文档 (https://github.com/powermock/powermock/wiki/mockito#mockito-mock-maker-inline)

它提供了两种方法

    org.mockito.plugins.MockMaker

    org/powermock/extensions/configuration.properties

试试这两种方法,看看哪一种适合你,然后保留其中一种。

在我的场景中,第二个对我有用。

我也尝试过这种旧方法testImplementation 'org.mockito:mockito-inline:X.X.X' 它对我不起作用。

【讨论】:

关于java.homejava_home之间的差异这里是link【参考方案28】:

如果您使用例如不同版本的 spring-boot-test,你可能有 bytebuddy 版本冲突,如上所述。要修复,您可以使用dependencyManagement:

<dependencies>
  <dependency>
     <groupId>org.mockito</groupId>
     <artifactId>mockito-core</artifactId>
     <version>3.11.2</version>
     <scope>test</scope>
  </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
     <dependency>
        <groupId>net.bytebuddy</groupId>
        <artifactId>byte-buddy</artifactId>
        <version>1.11.10</version>
     </dependency>
     <dependency>
        <groupId>net.bytebuddy</groupId>
        <artifactId>byte-buddy-agent</artifactId>
        <version>1.11.10</version>
     </dependency>
  </dependencies>
</dependencyManagement>

【讨论】:

【参考方案29】:

感谢@Łukasz Rzeszotarski 他的解决方案 - 它对我有用。我只是想补充一些关于这个问题的细节。

当我在我的 gradle 项目中包含 mockito-inline 时会出现此问题,但我无法拒绝它。它之所以出现是因为mockito-inline 具有以下结构:

META-INF:
    MANIFEST.MF
mockito-exstensions:
    org.mockito.plugins.MockMaker
    org.mockito.plugins.MemberAccessor

文件org.mockito.plugins.MockMaker 包含的位置:

mock-maker-inline

这个字符串是模拟最终类和方法所需要的,当您使用 JRE 而不是 JDK 时,它会导致问题。

【讨论】:

【参考方案30】:

我在切换到 Java 10 和 Spring Boot 2 时遇到了同样的异常。 这种依赖组合对我有用:

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>2.0.2-beta</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>net.bytebuddy</groupId>
        <artifactId>byte-buddy</artifactId>
        <version>1.8.16</version>
    </dependency>
    <dependency>
        <groupId>net.bytebuddy</groupId>
        <artifactId>byte-buddy-agent</artifactId>
        <version>1.8.16</version>
        <scope>test</scope>
    </dependency>

【讨论】:

以上是关于无法初始化插件:接口 org.mockito.plugins.MockMaker的主要内容,如果未能解决你的问题,请参考以下文章

Crashlytics Android Studio 插件无法初始化

AndroidStudio 模拟器无法在 macOS 上运行,因为“无法初始化 Qt 平台插件”

无法初始化 Row Reordering 插件 - rowReordering 不是函数

Crashlytics 插件 (2.2.2) 无法在 Android Studio (1.1.0) 上初始化

es使用同义词插件注意事项

es使用同义词插件注意事项