mock-maker-inline - не удалось инициализировать встроенный создатель макета Byte Buddy (power-mockito + jdk 8 + bytebuddy) - PullRequest
6 голосов
/ 17 февраля 2020

Я использую Powermockito, чтобы высмеивать и шпионить за стати c классов. Версия: 2.0.4

Также используется mockito-core версия 3.0.0 . В одном из моих проектов я могу использовать mockStati c, включив mock-maker-inline, как указано здесь https://github.com/powermock/powermock-examples-maven/blob/master/mockito2/src/test/resources/org/powermock/extensions/configuration.properties

Но, когда я попробовал такой же подход на своем другой проект, в котором обнаружена следующая ошибка:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.ghx.tpm.api.ISubscribedProductParameterService]: Factory method 'subscribedProductParameterService' threw exception; nested exception is java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
Caused by: java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
Caused by: java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker implementation declared in sun.misc.CompoundEnumeration@614aeccc
Caused by: java.lang.IllegalStateException: Failed to load MockMaker implementation: mock-maker-inline
Caused by: java.lang.IllegalStateException: Internal problem occurred, please report it. Mockito is unable to load the default implementation of class that is a part of Mockito distribution. Failed to load interface org.mockito.plugins.MockMaker
Caused by: org.mockito.exceptions.base.MockitoInitializationException: 

Could not initialize inline Byte Buddy mock maker. (This mock maker is not supported on Android.)

Java               : 1.8
JVM vendor name    : Oracle Corporation
JVM vendor version : 25.161-b12
JVM name           : Java HotSpot(TM) 64-Bit Server VM
JVM version        : 1.8.0_161-b12
JVM info           : mixed mode
OS name            : Linux
OS version         : 4.4.0-166-generic

Caused by: java.lang.IllegalStateException: Error during attachment using: net.bytebuddy.agent.ByteBuddyAgent$AttachmentProvider$Compound@3c89bb12
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.NullPointerException 

Не могли бы вы помочь в решении этой проблемы?

Дополнительные сведения:

  • Я шучу над классом шпионов c.
  • jar byte-buddy. Разрешенная версия зависимости 1.9.10
  • будет перекрывать mockito2, а powermock-api-mockito2 вызовет проблемы при загрузке MockMaker. ? как их решить?
  • Если тест выполняется в IDE, он работает нормально. но не работает при запуске в консоли maven.

Дополнительные выводы: Гарантированный JavassistMockClassLoader используется путем добавления @PrepareForTest и PowerMockRunner (поскольку один из моих других проектов работал с такой же конфигурацией)

Указатель на нулевой указатель исключения Исключение именно в этой строке:

ByteBuddyAgent.java (private static void install(AttachmentProvider attachmentProvider, String processId, String argument, AgentProvider agentProvider)
 Attacher.install(attachmentAccessor.getVirtualMachineType(), processId, agentProvider.resolve().getAbsolutePath(), argument);

Classloader во время сбоя - AppLaunchClassLoader. (Тогда как для рабочего проекта это URLClassLoader). Не уверен, что это различие может быть причиной.

Обновление 2:

  • @ PowerMockRule -> Это аннотирование инициализирует агент JVM один раз
  • Во время вызова Mockito.mock он пытается загрузить встроенный mock-maker-inline, который в свою очередь загружает агента в JVM. Это вызовет какие-либо проблемы? Я считаю, что метод VirtualMachine.attach () вызывается дважды. Не уверен, что это вызовет какие-либо проблемы.

Eclipse IDE загружает mock-maker-inline через tools.jar (работает нормально в IDE) Командная строка Maven загружает mock-maker-inline через powermock -module-javaagent (сбой с ошибкой инициализации). - Есть предложения заставить консоль maven подобрать инициализацию mock-maker-inline с помощью tools.jar?

Обновление 3: Я пошел на минималистичный подход c. Удалены все Spring-бегуны, создания Bean-компонентов, конфигурации контекста. Просто сохранил PowerMockRunner + stati c макет UUID.randomUUID () + Sysout .

Still сталкивается с ошибкой инициализации mock-maker-inline. чувствую себя очень странно !! та же конфигурация работает на моем другом проекте в том же рабочем пространстве!

1 Ответ

1 голос
/ 21 февраля 2020

Нашел проблему. @PowerMockRule (который использует powermock-modules-javaagent.JAR) является виновником.

Использование @PowerMockRule наряду с mock-maker-inline, вызывающим эту проблему.

Мне нужно заменить PowerMockRule на @ RunsWith (PowerMockRunner.class), чтобы исправить это. Спасибо.

Обновление 1: после исправления выше, столкнувшись с проблемами с загрузчиком классов, как обсуждено здесь https://github.com/raphw/byte-buddy/issues/813. Пожалуйста, не стесняйтесь поделиться своими предложениями. Спасибо

...