Nie można zainicjować wtyczki: interfejs org.mockito.plugins.MockMaker


99

Po rozpoczęciu testów pojawia się następujący wyjątek:

    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)

To jest mój 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);
        }
    }

Używam NetBeans 8.2. Ściągnąłem mockito-core-2.7.0.jar, a następnie wybieram "Test Libraries" -> "Add Jar" i dodałem mockito-core-2.7.0.jar.

Classpath i wszystko wygląda dobrze, wciąż mam wyjątek.

Jakakolwiek rada?


1
Sprawdź rozwiązanie na stackoverflow.com/a/41964561/4903889
AskQ,

Aktualizacja do nowszej wersji Mockito pomogła mi rozwiązać ten problem.
Yogesh Patil

Wyczyszczenie pamięci podręcznej Gradle i pobranie wszystkich zależności od zera naprawiło to za mnie. (Zobacz: stackoverflow.com/a/13567793/4568679 w celu wyczyszczenia pamięci podręcznej)
Slav

Odpowiedzi:


100

Jeśli używasz powermock, upewnij się, że Twoje zależności wskazują na:

org.powermock:powermock-api-mockito2

zamiast

org.powermock:powermock-api-mockito

1
Nie znam jeszcze dokładnej przyczyny, ale ta odpowiedź pomogła mi, gdy moje testy zakończyły się niepowodzeniem po aktualizacji wersji Spring 1.5.14-RELEASE do 2.0.4-RELEASE
Kenny

1
Pytanie nie ma nic wspólnego z powermockiem. Problem występuje, gdy używasz jre zamiast jdk.
Łukasz Rzeszotarski

18
Nie używam PowerMocka
IgorGanapolsky

A jeśli nie używasz PowerMock? Pytanie dotyczyło interfejsu org.mockito.plugins.MockMaker.
portfoliobuilder

49

Brak odniesienia do:

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

Od wersji beta Mockito 2.0.2, Mockito-core ma zależności.


7
te biblioteki są włączone domyślnie, to nie jest rozwiązanie
Eduardo

Mogę potwierdzić, że dodanie najnowszego bajtu-budy (i bardziej prawdopodobne, bajtowego-znajomego-agenta) JAR-a do "najnowszego największego" mockito pomaga tutaj. Dla mnie wyjątek od pytania pojawił się po włączeniu "kpiny z końcowych" zajęć z mockito 2.
GhostCat

1
są to zależności przechodnie i nie musisz ich jawnie dodawać.
Łukasz Rzeszotarski

Dla mockito 2.25.1trzeba tylko objenesis-3.0.1.jari byte-buddy-1.9.12.jar.
user1485864

1
Deps thease są również wymienione na stronie maven , na dole strony. Uwzględnienie tego rozwiązuje problem.
Davide,

15

Miałem Byte Buddy na ścieżce klas (jest to przechodnia dep Mockito 2.8.9) i nadal mam wyjątek. Powodem dla mnie było to, że przeprowadziłem testy jednostkowe z JRE zamiast JDK. Przejście na JDK zadziałało dla mnie.


1
Jak to zmieniłeś?
Taranmeet Singh

2
@TaranmeetSingh, jeśli korzystasz z Android Studio, przejdź do Plik> Struktura projektu> Lokalizacja SDK i sprawdź, czy ścieżki do JDK są prawidłowe. (Będziesz musiał pobrać JDK, jeśli jeszcze tego nie zrobiłeś ze strony internetowej Oracle).
Lydia Ralph

Cześć @LydiaRalph dzięki za sugestię, właściwie miałem zupełnie inny problem. Pisałem przypadki testowe Unit dla jednego z modułów (które są również samodzielnymi projektami studia Android), ale zamiast tego otworzyłem cały projekt w Android Studio. Przejście na samodzielny projekt rozwiązało ten problem.
Taranmeet Singh

@Stefano, jak się przełączyć, ponieważ nie wspomniałem o żadnym miejscu używania jdk lub jre
Tarun

To naprawiło to dla mnie. Właśnie usunąłem JRE z Java Runtimes Eclipse, pozostawiając tylko JDK.
Guillaume F.

6

Miałem ten sam problem - ten sam ślad stosu pojawia się w moim logu. Zwykle jest to problem z konfiguracją projektu ... LUB
Problem może dotyczyć plików JAR bytebuddys, jeśli nie zostały one poprawnie pobrane.
Kiedy próbuję ręcznie sprawdzić klasę ClassLoadingStrategy, pojawia się błąd zip .

W takim przypadku wystarczy ręcznie usunąć Byte Buddy z lokalnego katalogu maven, zwykle znajdującego się pod adresem:
{home} /. M2 / repository / net / bytebuddy /

Przy następnej próbie uruchomienia projektu lub testu zostaną one pobrane ponownie i powinny działać zgodnie z oczekiwaniami.

Niestety, popularny program Java ClassLoader działa w ten sam sposób, gdy brakuje klasy lub pliku jar, a także plik jar jest uszkodzony.


Jest jeszcze jedna możliwość: Hibernate ma również net.bytebuddy*jako zależność, więc zależności mogą być ze sobą w konflikcie.
ruzenhack

6

Ten problem z Mockito2 pojawia się, jeśli włączysz opcję mockowania klas końcowych.

Oznacza to, że gdy w katalogu test / resources / mockito-extensions znajduje się plik o nazwie org.mockito.plugins.MockMaker z następującą zawartością mock-maker-inline .

W takim przypadku byte-buddy, który jest zależnością przechodnią dla mockito-core, ma problem z dołączeniem własnego agenta do procesu java. Ale problem występuje tylko wtedy, gdy używasz środowiska JRE.

Rozwiązaniem byłoby:

  • Użyj JDK zamiast JRE

lub

  • dodaj -javaagent:byte-buddy-agent-*.jarjako opcję maszyny wirtualnej

W Android Studio jak sprawdzić, czy używasz JRE zamiast JDK i jak byś to zmienił?
sbearben

Mam ten sam problem z Androidem Studio. Czy komuś się udało?
Ajay Thomas,

3

Problem: PowerMock + Mockito + TestNG + PowerMockTestCase

Dzielenie się moim problemem / rozwiązaniem na wypadek, gdyby komuś pomogło.

Moje zależności zostały poprawnie wskazane:

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'

Ale nadal mam następujący błąd:

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)

Mój test był taki:

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

Jak wspomniano w tym wątku, usunięcie initMocks()metody usuwa błąd, ale wszystkie makiety stają się puste.


✅ Rozwiązanie: BeforeTest VS BeforeMethod

W moim przypadku odkryłem, że @BeforeTestfaktycznie stanowi problem. Zmiana w celu @BeforeMethodrozwiązania problemu.

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

Domyślam się, że ma to coś wspólnego z zastrzykiem fasoli; @BeforeTestjest wykonywany przed wstrzyknięciem jakichkolwiek ziaren, a @BeforeMethodwykonywany po wstrzyknięciu ziaren. Nie jestem pewien, jak to naprawdę wpłynęło.


Czy masz rozwiązanie bez powermocka?
portfoliobuilder

@portfoliobuilder, jeśli nie używasz powermocka, nie sądzę, że napotkasz ten sam problem, co ja. Prawdopodobnie mógłbyś dwukrotnie sprawdzić inne sugestie podane w tym wątku? Upewnij się, że mockito jest zaktualizowane, że używasz jdk i nie masz brakujących odniesień.
Ely

1

W moim przypadku pracowałem nad projektem, który nie korzysta z systemu budowania Maven. Więc to działa dla mnie.

Uwaga: (tworzenie biblioteki jest opcjonalne, możesz dodać słoiki bezpośrednio do ścieżki budowania projektu)

Mam nadzieję, że to komuś pomoże.


1

Usuń ręcznie plik „byte-buddy-1.7.11.jar” ze ścieżki repozytorium maven, która pojawia się w błędzie. Maven zaktualizuje projekt, a problem zostanie rozwiązany. Próbował i pracował dla mnie.


1

Mockito 2 wymaga zależności. Dodanie poniżej dwóch zależności ByteBuddy. rozwiązał problem za mnie:

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

W moim przypadku dołączam do projektu pliki jar, które można znaleźć pod adresem : https://bintray.com/raphw/maven/ByteBuddy/

Jeśli potrzebujesz go do projektu Maven, po prostu dodaj:

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

1

Dla mnie problem polegał na tym, że IntelliJ przeprowadził test jako test integracji. Musiałem więc ręcznie stworzyć test JUnit

wprowadź opis obrazu tutaj


Może masz ten test jednostkowy w katalogu androidTest? Zakładam, że spodziewam się testów instrumentalnych w „androidTest” i testów jednostkowych w „teście”.
Kikiwa

0

w moim przypadku jakieś nieprawidłowe ustawienie środowiska env również doprowadzi do tego błędu:

w Ubuntu 16.04, java i javac były alternatywami dla aktualizacji 7, ale $ JAVA_HOME zostało błędnie ustawione na 8

usunąłem $ JAVA_HOME i wszystko wróciło do normy


0

Dodanie do tego bnd aspektu

Dodając do odpowiedzi Paskasa , musisz również uwzględnić zależności w repozytorium cnf maven, jeśli używasz takiego (takiego jak moje 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

a dla wygodnego odwoływania się możesz dołączyć zmienną bnd do swojego pliku 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

oraz w pliku bnd projektu

-testpath:\
    ${mockito}

0

Miałem ten sam problem w jednym istniejącym projekcie. Użyłem java 8 i dodatkowo zainstalowałem java 10. Więc zacząłem otrzymywać ten wyjątek. Odinstalowałem java 10, to nie pomogło. Usunąłem słoiki bytebuddy z repozytorium maven, to nie pomogło. Dopiero po całkowitym usunięciu wszystkich słoików z repozytorium maven mogłem ponownie skompilować projekt.


0

Deklaracja usuwania wersji działa dla mnie:

Przykład:

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

usunąć 2.8.9

Po:

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

Może to być spowodowane problemem wersji między pakietami jar tej zależności.


na pewno odziedziczysz wersję, ponieważ jej usunięcie zepsuje projekt. Zła, tak zła odpowiedź.
eduyayo

0

Nie jest to odpowiedź na oryginalny plakat, ponieważ używa Netbeans, ale w Eclipse musiałem zrobić "Maven -> Update Project", aby testy znów działały.



0

Rozwiązałem ten problem, usuwając jmockit w POM XML for Maven. Po tym moje testy Junit 5 działają idealnie.

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

Z tą zależnością zawsze otrzymuję błąd taki jak:

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

Wyraźnie zdefiniuj zależność mockito, ponieważ wersja w twoim powermock i springboot różni się testCompile: „org.mockito”, nazwa: „mockito-core”, wersja: „2.8.9”


0

Moja zależność dla mockito znajdowała się w ramach androidTestImplementation, a nie w testImplementation.

Wystąpił ten sam błąd, gdy próbowałem użyć mockito z moimi testami jednostkowymi. Wszystko, co musiałem zrobić, to dodać zależność.


0

W moim przypadku po usunięciu mockito-coretest zadziałał!

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

Moja wersja jest tutaj, a JDK to 1.8.0_121.

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

Teraz moje zależności to:

  • powermock-api-mockito2
  • moduł powermock-junit4

0

W przypadku programowania na Androida musisz zaimportować kilka rzeczy:

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

nie mogłem znaleźć żadnego odniesienia do tego, ale jest to jedyne, które zadziałało dla mnie.


0

Zadziałało dla mnie po usunięciu folderu bytebuddy z $ {home} .m2 \ repository \ net \ bytebuddy i usunięciu zależności byte-buddy-agent, byte-buddy i objenesis z pom.xml



-1

Miałem ten sam wyjątek, kiedy przełączałem się na Javę 10 i Spring Boot 2. Ta kombinacja zależności zadziałała dla mnie:

    <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

Miałem ten sam problem i wypróbowałem rozwiązanie @ Paskas, działało dobrze Junit Test na początku był ok. dodał zależność bytebuddy do mojego pom.xml:

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

Mam nadzieję że to pomoże.


-3

Po prostu zaktualizuj do najnowszej wersji org.mockito:mockito-core. Kiedy to zrobiłem, błędy zniknęły!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.