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


99

一旦开始测试,我将收到以下异常信息:

    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,然后选择“测试库”->“添加罐子”并添加了mockito-core-2.7.0.jar。

类路径,一切看起来都很好,我还是在例外。

有什么建议吗?


1

升级到较新的Mockito版本可以帮助我解决此问题。
Yogesh Patil

清除Gradle缓存并从头开始下载所有依赖项已为我修复。(有关清除缓存的信息,请参见:stackoverflow.com/a/13567793/4568679
Slav

Answers:


100

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

org.powermock:powermock-api-mockito2

代替

org.powermock:powermock-api-mockito

1
我尚不知道确切的原因,但是当我将Spring版本1.5.14-RELEASE升级到2.0.4-RELEASE后测试失败时,此答案对我有所帮助
Kenny

1
这个问题与powermock无关。当您使用jre而不是jdk时,会发生问题。
卢卡斯Rzeszotarski

18
我没有使用PowerMock
IgorGanapolsky '19

如果您不使用PowerMock?该问题确实引用了org.mockito.plugins.MockMaker接口。
portfoliobuilder

49

缺少参考:

  • 字节伙伴1.6.5.jar
  • byte-buddy-agent-1.6.5.jar
  • objenesis-2.5.jar

从Mockito 2.0.2 beta版开始,Mockito-core具有依赖性。


7
这些库是默认包含的,这不是解决方案
Eduardo

我可以确认将最新的字节预算(更可能是字节预算代理)JAR添加到“最新的” mockito设置帮助中。对我来说,从问题的异常后能够与2的Mockito班“最后的嘲弄”出现了
GhostCat

1
这些是传递依赖,您不必显式添加它们。
卢卡斯Rzeszotarski

因为mockito 2.25.1你只需要objenesis-3.0.1.jarbyte-buddy-1.9.12.jar
user1485864

1
Thease部门也在页面底部的Maven页面中列出。包括它可以解决问题。
戴维(Davide)

15

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


1
您是如何改变的?
Taranmeet Singh,

2
@TaranmeetSingh(如果您正在使用Android Studio运行),请转至“文件”>“项目结构”>“ SDK位置”,然后检查JDK的路径是否正确。(如果尚未从Oracle网站下载,则需要下载JDK。)
Lydia Ralph,

嗨@LydiaRalph感谢您的建议,实际上我有一个完全不同的问题。我正在为其中一个模块(也是独立的android studio项目)编写单元测试用例,但我改为在android studio中打开了整个项目。切换到独立项目对我来说解决了这个问题。
Taranmeet Singh,

@Stefano,如何切换,因为我没有提到在任何使用jdk或jre的地方
Tarun

这为我解决了。我刚刚从Eclipse的Java运行时中删除了JRE,仅保留了JDK。
Guillaume F.

6

我有同样的问题-相同的stacktrace出现在我的日志中。通常是项目设置中
的问题...或如果未正确下载字节码的JAR,则可能是问题所在。
当我尝试手动检查ClassClassLoadingStrategy类时,出现zip错误。

在这种情况下,从本地maven目录中手动删除Byte Buddy就足够了,通常位于以下位置:
{home} /。m2 / repository / net / bytebuddy /

下一次尝试运行项目或测试它们将再次下载并且应该可以运行如预期的那样。

不幸的是,当缺少类或jar以及jar损坏时,常见的Java ClassLoader面对的方式也相同。


还有另一种可能性:Hibernate也具有net.bytebuddy*作为依赖项,因此依赖项可能彼此冲突。
ruzenhack

6

如果启用了模拟最终类的选项,则会发生Mockito2的此问题。

这意味着,当在test / resources / mockito-extensions目录中时,您将拥有一个名为org.mockito.plugins.MockMaker的文件,其中包含以下内容mock-maker-inline

在这种情况下,byte-buddy(是模仿内核的传递依赖项)存在将自己的代理附加到Java进程的问题。但是仅当您使用JRE时,才会出现问题。

解决方案是:

  • 使用JDK代替JRE

要么

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

在Android Studio中,如何检查是否使用JRE而不是JDK,以及如何更改它?
sbearben

我对Android Studio有同样的问题。有人成功了吗?
Ajay Thomas

3

问题: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()方法将删除错误,但所有模拟都将变为null。


✅解决方案: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);
    }
}

我的猜测是这与豆类注射有关。 @BeforeTest在注入任何bean之前执行,而@BeforeMethod在bean注入之后执行。不确定如何真正影响。


您有没有powermock的解决方案吗?
portfoliobuilder

@portfoliobuilder如果您不使用powermock,我认为您不会遇到我遇到的相同问题。可能您可以再次检查该线程上给出的其他建议?确保mockito已更新,您正在使用jdk,并且没有缺少的引用。
伊利

1

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

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

希望这对某人有帮助。


1

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


1

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

  • byte-buddy-xxxx.jar
  • byte-buddy-agent-xxxx.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>

1

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

在此处输入图片说明


也许您在androidTest目录中有此单元测试?我假设AS希望在“ androidTest”中具有已测试的测试,而在“ test”中具有单元测试。
奇奇瓦

0

就我而言,某些不正确的env设置也会导致此错误:

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

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


0

为此添加bnd方面

加上Paskas的答案,如果使用的是依赖项(例如my cnf/central.mvn),还必须将依赖项包括在cnf maven存储库中。

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

为了方便引用,您可以在您的计算机中包含一个bnd变量 cnf/build.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}

0

我在一个现有项目中遇到了同样的问题。我使用了Java 8,并另外安装了Java10。因此,我开始遇到此异常。我卸载了Java 10,它没有帮助。我从Maven仓库中删除了bytebuddy罐子,但没有帮助。只有从maven repo中完全删除所有jar之后,我才能再次编译项目。


0

删除版本声明对我有用:

例:

    <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包之间的版本问题。


您肯定会继承该版本,因为删除它会破坏项目。错误的答案如此错误。
eduyayo19年

0

因为他/她使用的是Netbeans,所以不是最初发布者的答案,但是在Eclipse中,我需要执行“ Maven-> Update Project”以使测试再次起作用。



0

我通过删除Maven的POM XML中的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
...

0

明确定义嘲笑依赖,因为powermock和springboot中的版本与testCompile组不同:'org.mockito',名称:'mockito-core',版本:'2.8.9'


0

我对Mockito的依赖关系在androidTestImplementation下,而不在testImplementation下。

当我尝试在单元测试中使用Mockito时,出现了相同的错误。我要做的就是添加依赖项。


0

就我而言,删除后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模块junit4

0

对于android开发,您需要导入以下内容:

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

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


0

它为我工作后,我从$ {home} .m2 \ repository \ net \ bytebuddy中删除了bytebuddy文件夹,并从pom.xml中删除了byte-buddy-agent,byte-buddy和objenesis依赖关系



-1

切换到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>

-1

我遇到了同样的问题,并尝试了@Paskas的解决方案,起初在Junit Test上运行良好。在我的pom.xml中添加了bytebuddy依赖项:

<dependency>
            <groupId>net.bytebuddy</groupId>
            <artifactId>byte-buddy-dep</artifactId>
            <version>1.9.7</version>
</dependency>

希望这可以帮助。


-3

只需更新到的最新版本即可org.mockito:mockito-core。一旦我做了,错误就消失了!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.