Почему PowerMock использует библиотеку javassist, а Mockito не используется - PullRequest
0 голосов
/ 07 сентября 2018

Я не понимаю, почему PowerMock использует библиотеку javassist, а Mockito - нет.

1 Ответ

0 голосов
/ 08 сентября 2018

Большинство разговоров о библиотеках генерации кода в Java сосредоточены вокруг трех библиотек: cglib, javassist и ByteBuddy. Ранее Mockito был на cglib, но теперь использует ByteBuddy в качестве генератора кода по умолчанию.

Как отмечает автор ByteBuddy Рафаэль Винтерхальтер здесь :

javassist предлагает API для изменения классов, а не только для их подклассов. Эти API также допускают манипуляции на уровне байтового кода, тогда как cglib допускает только несколько жестко закодированных перехватов.

Хотя я не участвую ни в одной из этих макетов или библиотек для имитации, стоит отметить, что Powermock работает частично, редактируя реализации классов для перехвата вызовов частных, статических и конечных методов и классов в скомпилированном байт-коде. Это, вероятно, объясняет требование использовать javassist от Powermock: cglib не был способен редактировать существующие классы. Напротив, Mockito требует более простой генерации кода для генерации подкласса данного класса; это функциональные возможности, которые cglib и ByteBuddy были написаны для обеспечения.

Обратите внимание, что открытая проблема Powermock 727 отслеживает неполную миграцию Powermock с Javassist на ByteBuddy.

Теперь, наоборот: почему Mockito не переключается на Javassist вместо ByteBuddy? Опять же, у нас нет прямого ответа, но учебник ByteBuddy выражает мнение (в разделе «Общая информация» для Javassist, выделено мое):

Эта библиотека поставляется с компилятором, который принимает строки, содержащие исходный код Java, которые переводятся в байт-код Java во время выполнения приложения. Это очень амбициозная и в принципе отличная идея, поскольку исходный код Java, очевидно, является отличным способом описания классов Java. Однако компилятор Javassist не сравнивается с компилятором javac по своей функциональности и допускает легкие ошибки при динамическом составлении строк для реализации более сложной логики. Кроме того, Javassist поставляется с прокси-библиотекой, которая похожа на JCL прокси утилиты, но позволяют расширять классы и не ограничиваются интерфейсами Однако возможности прокси-инструментов Javassist остаются одинаково ограниченными по API и функциональности.

Вкратце: есть неподтвержденная причина сомневаться в безопасности / функциональности / стабильности Javassist. Mockito не требовал функций Javassist, поэтому он мог мигрировать прямо из cglib в ByteBuddy. PowerMock действительно требовал функций Javassist, и усилия по переносу PowerMock на ByteBuddy зашли в тупик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...