Plugin konnte nicht initialisiert werden: Schnittstelle org.mockito.plugins.MockMaker

93

Nach dem Start der Tests wird folgende Ausnahme angezeigt:

    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)

Das ist mein Test:

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);
        }
    }

Ich verwende NetBeans 8.2. Ich habe mockito-core-2.7.0.jar heruntergeladen und dann "Test Libraries" -> "Add Jar" ausgewählt und mockito-core-2.7.0.jar hinzugefügt.

Klassenpfad und alles sieht in Ordnung aus, ich bekomme immer noch eine Ausnahme.

Irgendein Rat?

Paskas
quelle
1
Überprüfen Sie die Lösung unter stackoverflow.com/a/41964561/4903889
AskQ
Ein Upgrade auf eine neuere Version von Mockito hat mir geholfen, dieses Problem zu lösen.
Yogesh Patil
Das Löschen des Gradle-Cache und das Herunterladen aller Abhängigkeiten von Grund auf haben das Problem für mich behoben. (Siehe: stackoverflow.com/a/13567793/4568679 zum Löschen des Cache)
Slav

Antworten:

98

Wenn Sie Powermock verwenden, stellen Sie sicher, dass Ihre Abhängigkeiten auf Folgendes verweisen:

org.powermock:powermock-api-mockito2

anstatt

org.powermock:powermock-api-mockito
Addev
quelle
1
Ich kenne die genaue Ursache noch nicht, aber diese Antwort half mir, als meine Tests nach dem Upgrade von Spring Version 1.5.14-RELEASE auf 2.0.4-RELEASE
Kenny
1
Die Frage hat nichts mit Powermock zu tun. Das Problem tritt auf, wenn Sie jre anstelle von jdk verwenden.
Łukasz Rzeszotarski
15
Ich benutze nicht PowerMock
IgorGanapolsky
48

Fehlender Hinweis auf:

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

Seit Mockito 2.0.2 Beta hat Mockito-Core Abhängigkeiten.

Paskas
quelle
7
Diese Bibliotheken sind standardmäßig enthalten, dies ist nicht die Lösung
Eduardo
Ich kann bestätigen, dass das Hinzufügen der neuesten Byte-Budy-JARs (und wahrscheinlicher des Byte-Buddy-Agenten) zu einer "neuesten größten" Mockito-Setup-Hilfe hier. Für mich zeigte sich die Ausnahme von der Frage, nachdem ich mit mockito 2 das "Verspotten der letzten" Klassen aktiviert hatte.
GhostCat
1
Dies sind transitive Abhängigkeiten, die Sie nicht explizit hinzufügen müssen.
Łukasz Rzeszotarski
Für mockito 2.25.1Sie brauchen nur objenesis-3.0.1.jarund byte-buddy-1.9.12.jar.
user1485864
Die Thease Deps sind auch auf der Maven-Seite unten auf der Seite aufgeführt. Einschließlich es lösen das Problem.
Davide
13

Ich hatte Byte Buddy auf dem Klassenpfad (ist eine transitive Dep von Mockito 2.8.9) und bekam immer noch die Ausnahme. Grund für mich war, dass ich die Unit-Tests mit JRE anstelle von JDK durchgeführt habe. Der Wechsel zu JDK hat bei mir funktioniert.

Stefano L.
quelle
1
Wie haben Sie das geändert?
Taranmeet Singh
2
@TaranmeetSingh Wenn Sie mit Android Studio arbeiten, gehen Sie zu Datei> Projektstruktur> SDK-Speicherort und überprüfen Sie, ob die Pfade zu Ihrem JDK korrekt sind. (Sie müssen ein JDK herunterladen, wenn Sie noch nicht von der Oracle-Website.)
Lydia Ralph
Hallo @LydiaRalph, danke für den Vorschlag, eigentlich hatte ich ein ganz anderes Problem. Ich schrieb Unit-Testfälle für eines der Module (die auch eigenständige Android Studio-Projekte sind), aber ich hatte stattdessen das gesamte Projekt in Android Studio geöffnet. Der Wechsel zum eigenständigen Projekt hat dies für mich gelöst.
Taranmeet Singh
@ Stefano, wie man wechselt, da ich nicht erwähnt habe, wo mit jdk oder jre
Tarun
Das hat es für mich behoben. Ich habe gerade die JRE aus den Java Runtimes von Eclipse entfernt und nur das JDK belassen.
Guillaume F.
6

Ich hatte das gleiche Problem - der gleiche Stacktrace wird in meinem Protokoll angezeigt. Es ist normalerweise ein Problem mit der Projekteinrichtung ... ODER
Das Problem kann in den Bytebuddys-JARs liegen, wenn diese nicht korrekt heruntergeladen wurden.
Wenn ich versuche, die Klasse ClassLoadingStrategy manuell zu überprüfen, wird ein Zip- Fehler angezeigt .

In diesem Fall reicht es gerade aus, den Byte Buddy manuell aus dem lokalen Maven-Verzeichnis zu löschen, das sich normalerweise unter folgender Adresse befindet:
{home} /. M2 / repository / net / bytebuddy / Beim

nächsten Versuch, ein Projekt auszuführen oder zu testen, werden sie erneut heruntergeladen und sollten funktionieren wie erwartet.

Leider sieht der häufig vorkommende Java ClassLoader genauso aus, wenn die fehlende Klasse oder das fehlende JAR sowie das JAR beschädigt sind.

vdou
quelle
Es gibt noch eine andere Möglichkeit: Der Ruhezustand hat auch net.bytebuddy*eine Abhängigkeit, daher können die Abhängigkeiten in Konflikt miteinander stehen.
Ruzenhack
5

Dieses Problem mit Mockito2 tritt auf, wenn Sie die Option zum Verspotten von Abschlussklassen aktivieren.

Dies bedeutet, wenn Sie in Ihrem Verzeichnis test / resources / mockito-extensions die Datei org.mockito.plugins.MockMaker mit dem folgenden Inhalt mock-maker-inline haben .

In diesem Fall hat Byte-Buddy, eine transitive Abhängigkeit für Mockito-Core, das Problem, einen eigenen Agenten an den Java-Prozess anzuhängen. Das Problem tritt jedoch nur auf, wenn Sie JRE verwenden.

Die Lösung wäre entweder:

  • Verwenden Sie JDK anstelle von JRE

oder

  • -javaagent:byte-buddy-agent-*.jarals VM-Option hinzufügen
Łukasz Rzeszotarski
quelle
Wie können Sie in Android Studio überprüfen, ob Sie JRE anstelle von JDK verwenden, und wie würden Sie dies ändern?
sbearben
Ich habe das gleiche Problem mit Android Studio. War jemand erfolgreich?
Ajay Thomas
Von Embedded JRE zu JDK 14 geändert und es hat funktioniert.
Abhimanyu
3

Problem: PowerMock + Mockito + TestNG + PowerMockTestCase

Teilen Sie mein Problem / meine Lösung, falls es jemandem hilft.

Meine Abhängigkeiten waren alle richtig angegeben:

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'

Aber ich habe immer noch den folgenden Fehler bekommen:

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)

Mein Test war so etwas wie:

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);
    }
}

Wie in diesem Thread erwähnt, wird durch Entfernen der initMocks()Methode der Fehler behoben, aber alle Mocks werden null.


✅ Lösung: BeforeTest VS BeforeMethod

Was ich für meinen Fall herausgefunden habe, ist, dass dies @BeforeTesttatsächlich ein Problem darstellt. Ändern Sie es, @BeforeMethodum den Fehler zu beheben.

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);
    }
}

Ich vermute, dass es etwas mit der Injektion von Bohnen zu tun hat. @BeforeTestwird ausgeführt, bevor Bohnen injiziert wurden, während @BeforeMethodes nach der Injektion von Bohnen ausgeführt wird. Ich bin mir nicht sicher, wie es sich wirklich ausgewirkt hat.

Ely
quelle
1

In meinem Fall habe ich an einem Projekt gearbeitet, das das Maven-Build-System nicht verwendet. Das hat also bei mir funktioniert.

NB: (Das Erstellen der Bibliothek ist optional. Sie können die Jars direkt zu Ihrem Projekterstellungspfad hinzufügen.)

Hoffe das hilft jemandem.

Kelli
quelle
1

Löschen Sie das "byte-buddy-1.7.11.jar" manuell aus dem Maven-Repository-Pfad, der im Fehler angezeigt wird. Maven aktualisiert das Projekt und das Problem wird behoben. Versuchte und arbeitete für mich.

Arjun
quelle
1

Mockito 2 erfordert Abhängigkeiten. Hinzufügen der beiden folgenden ByteBuddy-Abhängigkeiten. löste das Problem für mich:

  • byte-buddy-xxxx.jar
  • byte-buddy-agent-xxxx.jar

In meinem Fall füge ich JAR-Dateien in das Projekt ein, die unter folgender Adresse zu finden sind: https://bintray.com/raphw/maven/ByteBuddy/

Wenn Sie es für ein Maven-Projekt benötigen, fügen Sie einfach Folgendes hinzu:

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

Für mich war das Problem, dass IntelliJ den Test als Integrationstest durchführte. Also musste ich den JUnit-Test manuell erstellen

Geben Sie hier die Bildbeschreibung ein

Tonisive
quelle
0

In meinem Fall führt auch eine abnormale Umgebungseinstellung zu diesem Fehler:

In Ubuntu 16.04 waren Java und Javac Update-Alternativen zu 7, aber $ JAVA_HOME wurde fälschlicherweise auf 8 gesetzt

Ich entferne das $ JAVA_HOME und alles wieder normal

cfz
quelle
0

Hinzufügen eines bnd Aspekts dazu

Wenn Sie die Antwort von Paskas ergänzen, müssen Sie auch die Abhängigkeiten in das cnf maven-Repository aufnehmen, wenn Sie eine verwenden (wie meine 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

und für eine bequeme Referenzierung können Sie eine bnd-Variable in Ihre aufnehmen 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

und in der bnd-Datei Ihres Projekts

-testpath:\
    ${mockito}
Zymus
quelle
0

Ich hatte das gleiche Problem in einem bestehenden Projekt. Ich habe Java 8 verwendet und zusätzlich Java 10 installiert. Also habe ich angefangen, diese Ausnahme zu bekommen. Ich habe Java 10 deinstalliert, es hat nicht geholfen. Ich habe Bytebuddy-Gläser aus Maven Repo gelöscht, es hat nicht geholfen. Erst nach dem vollständigen Entfernen aller Gläser aus dem Maven Repo konnte ich das Projekt erneut kompilieren.

römisch
quelle
0

Versionserklärung entfernen funktioniert bei mir:

Beispiel:

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

2.8.9 entfernen

Nach:

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

Dies kann auf ein Versionsproblem zwischen JAR-Paketen dieser Abhängigkeit zurückzuführen sein.

Hai Huang
quelle
Sie erben sicherlich die Version, da das Entfernen das Projekt beschädigen wird. Falsche so falsche Antwort.
Eduyayo
0

Nicht die Antwort auf das Originalposter, da er / sie Netbeans verwendet, aber in Eclipse musste ich "Maven -> Projekt aktualisieren" ausführen, damit die Tests wieder funktionieren.

Brimstedt
quelle
0

Ich bin auf dieses Problem gestoßen und habe es gelöst, indem ich meine Version von org.mockito.mockito-core auf die neueste Version gebracht habe. Ich hatte schon seit einiger Zeit eine ältere Version verwendet.

Adil B.
quelle
0

Ich habe dieses Problem gelöst, indem ich jmockit in POM XML für Maven entfernt habe. Danach funktionieren meine Junit 5-Tests einwandfrei.

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

Mit dieser Abhängigkeit erhalte ich immer einen Fehler wie:

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
...
Guchelkaben
quelle
0

Definieren Sie die Mockito-Abhängigkeit explizit, da sich die Version in Ihrem Powermock und Springboot von der testCompile-Gruppe unterscheidet: 'org.mockito', Name: 'mockito-core', Version: '2.8.9'

Ayu
quelle
0

Meine Abhängigkeit für mockito war unter androidTestImplementation und nicht unter testImplementation.

Ich habe den gleichen Fehler erhalten, als ich versucht habe, Mockito für meine Unit-Tests zu verwenden. Ich musste nur die Abhängigkeit hinzufügen.

lukas hansen
quelle
0

In meinem Fall mockito-corehat der Test nach dem Entfernen funktioniert!

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

Meine Version ist hier und JDK ist 1.8.0_121.

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

Jetzt sind meine Abhängigkeiten:

  • powermock-api-mockito2
  • powermock-module-junit4
Kyakya
quelle
-1

Ich hatte die gleiche Ausnahme beim Wechsel zu Java 10 und Spring Boot 2. Diese Abhängigkeitskombination funktionierte für mich:

    <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>
Svitlana Onish
quelle
-1

Ich hatte das gleiche Problem und habe die Lösung von @ Paskas ausprobiert. Junit Test hat zunächst gut funktioniert. hat die bytebuddy-Abhängigkeit zu meiner pom.xml hinzugefügt:

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

Hoffe das hilft.

Youssef Kesbaoui
quelle
-2

Aktualisieren Sie einfach auf die neueste Version von org.mockito:mockito-core. Sobald ich das tat, verschwanden die Fehler!

Huw Davies
quelle