Не вдалося ініціалізувати плагін: інтерфейс org.mockito.plugins.MockMaker


94

Я отримую наступний виняток після запуску тестів:

    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, а потім вибрав "Тестові бібліотеки" -> "Додати Jar" і додав mockito-core-2.7.0.jar.

Classpath і все виглядає нормально, я все ще отримую виняток.

Будь-яка порада?


1
Перевірити рішення в stackoverflow.com/a/41964561/4903889
AskQ

Оновлення до нової версії Mockito допомогло мені вирішити цю проблему.
Йогеш Патіл,

Очищення кешу Gradle та завантаження всіх залежностей з нуля виправили це для мене. (Див .: stackoverflow.com/a/13567793/4568679 щодо очищення кеш-пам’яті)
Слав

Відповіді:


98

Якщо ви використовуєте Powermock, переконайтеся, що ваші залежності вказують на:

org.powermock:powermock-api-mockito2

замість

org.powermock:powermock-api-mockito

1
Я ще не знаю точної причини, але ця відповідь допомогла мені, коли мої тести провалились після оновлення Spring версії 1.5.14-RELEASE до 2.0.4-RELEASE
Кенні

1
Питання не має нічого спільного з powermock. Проблема виникає, коли ви використовуєте jre замість jdk.
Лукаш Жешотарський

15
Я не використовую PowerMock
Ігор

48

Відсутнє посилання на:

  • byte-buddy-1.6.5.jar
  • byte-buddy-agent-1.6.5.jar
  • об'єнезис-2.5.jar

Починаючи з бета-версії Mockito 2.0.2, Mockito-core має залежності.


7
ці бібліотеки включені за замовчуванням, це не рішення
Едуардо

Я можу підтвердити, що додавання найновіших JAR-файлів byte-budy (і, швидше за все, byte-buddy-agent) до "останньої найбільшої" допомоги в налаштуваннях mockito тут. Для мене виняток із питання з'явився після того, як дозволив "знущання над фінальними" класами з mockito 2.
GhostCat

1
це транзитивні залежності, вам не потрібно їх явно додавати.
Лукаш Жешотарський

Для mockito 2.25.1вас потрібні лише objenesis-3.0.1.jarі byte-buddy-1.9.12.jar.
user1485864

відділи театру також перелічені на сторінці maven , внизу сторінки. У тому числі це вирішить проблему.
Давіде

13

У мене був Байт Бадді на шляху до класу (це перехідний деп Mockito 2.8.9), і я все ж отримав виняток. Причиною для мене було те, що я провів модульні тести з JRE замість JDK. Перехід на JDK у мене спрацював.


1
Як ви це змінили?
Таранміт Сінгх

2
@TaranmeetSingh, якщо ви працюєте з Android Studio, перейдіть у меню Файл> Структура проекту> Розташування SDK і перевірте правильність шляхів до вашого JDK. (Вам потрібно завантажити JDK, якщо ви ще цього не зробили з веб-сайту Oracle.)
Лідія Ральф,

Привіт @LydiaRalph дякую за пропозицію, насправді у мене була зовсім інша проблема. Я писав модульні тестові кейси для одного з модулів (які також є автономними проектами для андроїд-студії), але натомість відкрив весь проект в андроїд-студії. Перехід на самостійний проект вирішив це для мене.
Таранміт Сінгх

@Stefano, як переключитися, оскільки я не згадував жодного з них, використовуючи jdk або jre
Тарун

Це мені це виправило. Я щойно видалив JRE з Java Runtimes Eclipse, залишивши лише JDK.
Гійом Ф.

6

У мене була та ж проблема - однаковий стек з'являється в моєму журналі. Зазвичай це проблема з налаштуванням проекту ... АБО
Проблема може бути у JAR-файлах bytebuddys, якщо вони були завантажені неправильно.
Коли я намагаюся перевірити клас ClassLoadingStrategy вручну, то я отримую помилку zip .

У цьому випадку достатньо вручну видалити Byte Buddy з локального каталогу maven, який зазвичай знаходиться за адресою:
{home} /. M2 / repository / net / bytebuddy /

. Наступної спроби запустити проект або тестування вони будуть завантажені знову і повинні працювати як і очікувалося.

На жаль, поширені Java ClassLoader стикаються так само, коли клас або jar відсутні, а також jar пошкоджена.


Існує ще одна можливість: Hibernate також є net.bytebuddy*залежною, тому залежності можуть конфліктувати між собою.
ruzenhack

5

Ця проблема з Mockito2 виникає, якщо ви ввімкнете опцію макет фінальних класів.

Це означає, що у вашому каталозі test / resources / mockito-extensions у вас є файл під назвою org.mockito.plugins.MockMaker із таким вмістом, що вбудований в mack -maker-inline .

У цьому випадку байт-приятель, який є транзитивною залежністю для mockito-core, має проблему приєднати власний агент до процесу Java. Але проблема виникає лише тоді, коли ви використовуєте JRE.

Рішення може бути:

  • Використовуйте JDK замість JRE

або

  • додати -javaagent:byte-buddy-agent-*.jarяк параметр VM

Як в Android Studio перевірити, чи використовуєте ви JRE замість JDK, і як би ви його змінили?
sbearben

У мене така сама проблема з Android Studio. Хтось був успішним?
Аджай Томас

Змінено з Embedded JRE на JDK 14, і це спрацювало.
Абхіманю

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()методу усуває помилку, але всі знущання стають нульовими.


✅ Рішення: 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виконується до того, як було введено будь-які боби, тоді @BeforeMethodяк виконується після ін'єкції квасолі. Не впевнений, як це насправді вплинуло.


1

У моєму випадку я працював над проектом, який не використовує систему побудови maven. Отже, це те, що мені вдалося.

Примітка: (створення бібліотеки необов’язково, банки можна додавати безпосередньо до шляху збірки проекту)

Сподіваюся, це комусь допомагає.


1

Видаліть "byte-buddy-1.7.11.jar" вручну із шляху сховища maven, який відображається у помилці. 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>


0

у моєму випадку деякі ненормальні налаштування env також призведуть до цієї помилки:

в ubuntu 16.04 java та javac були альтернативами оновлення 7, але $ JAVA_HOME було неправильно встановлено на 8

я видаляю $ JAVA_HOME і все повертається до звичного


0

Додавання до цього аспекту bnd

Додаючи до відповіді Паскаса , ви також повинні включити залежності у сховище 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

а для зручного посилання ви можете включити змінну 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 і додатково встановив java 10. Тож я почав отримувати цей виняток. Я видалив java 10, це не допомогло. Я видалив байт-байди з репозиторію maven, це не допомогло. Тільки після повного видалення всіх банок з репозиторію maven я міг знову скомпілювати проект.


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 цієї залежності.


ви напевно успадковуєте версію, оскільки її видалення порушить проект. Неправильна така неправильна відповідь.
eduyayo

0

Це не відповідь на оригінальний плакат, оскільки він / вона використовує Netbeans, але в Eclipse мені потрібно було зробити «Maven -> Update Project», щоб змусити тести знову запрацювати.



0

Я вирішив цю проблему, видаливши jmockit у POM XML для Maven. Після цього мої тести 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

Явно визначте залежність mockito, оскільки версія у вашому Powermock та Springboot відрізняється testCompile group: 'org.mockito', name: 'mockito-core', version: '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-module-junit4

-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. додав залежність bytebuddy до мого pom.xml:

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

Сподіваюся, це допомагає.


-2

Просто оновіть до останнього випуску org.mockito:mockito-core. Як тільки я це зробив, помилки зникли!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.