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?

Paskas
źródło
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
Addev
źródło
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.

Paskas
źródło
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.

Stefano L.
źródło
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.

vdou
źródło
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
Łukasz Rzeszotarski
źródło
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.

Ely
źródł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.

Kelli
źródło
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.

Arjun
źródło
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>
Vargha Hokmran
źródło
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

środki tonizujące
źródło
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

cfz
źródło
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}
Zymus
źródło
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.

rzymski
źródło
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.

Hai Huang
źródło
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.

Brimstedt
źródło
0

Napotkałem ten problem i rozwiązałem go, wbijając moją wersję org.mockito.mockito-core do najnowszej wersji. Od dłuższego czasu korzystałem ze starszej wersji.

Adil B.
źródło
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
...
Guchelkaben
źródło
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”

Ayu
źródło
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ść.

lukas hansen
źródło
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
kyakya
źródło
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.

mel3kings
źródło
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

Shafee Anwar
źródło
-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>
Svitlana Onish
źródło
-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.

Youssef Kesbaoui
źródło
-3

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

Huw Davies
źródło