PowerMock выбрасывает NoSuchMethodError (setMockName)

Я пытаюсь высмеять конструктор с помощью PowerMockito, но каждый раз, когда я запускаю тест, я получаю следующую ошибку:

java.lang.NoSuchMethodError: org.mockito.internal.creation.MockSettingsImpl.setMockName(Lorg/mockito/mock/MockName;)Lorg/mockito/internal/creation/settings/CreationSettings;
at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:107)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:60)
at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.createNewSubstituteMock(DefaultConstructorExpectationSetup.java:105)
at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.withAnyArguments(DefaultConstructorExpectationSetup.java:71)

У меня есть следующие зависимости PowerMock в моем проекте:

  • org.powermock: powermock-модуль-junit4: 1.5.6
  • org.powermock: powermock-Mockito-релиз-полный: 1.5.6

Я отслеживал дерево зависимостей моего проекта и фиксированные конфликты, чтобы mockito-all:1.9.5 включался в сборку.

Ответ 1

Моя проблема возникла из-за противоречивых версий javassist в моих проектных (транзитивных) зависимостях. То, что я сделал, это поиск всех зависимостей, которые ставят старую версию javassist в сборке, а затем исключают их. Например:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.5.1-Final</version>
    <scope>provided</scope>
    <exclusions>
        <exclusion>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Ответ 2

Убедитесь, что версии powermockito и mockito выровнены, как в этой диаграмме версий - MockitoUsage # поддерживаемые версии,

Mockito                     | PowerMock
------------------------------------------------------------------------------
2.0.0-beta - 2.0.42-beta    |   1.6.5+
------------------------------------------------------------------------------
1.10.19                     |   1.6.4
1.10.8 - 1.10.x             |   1.6.2+
1.9.5-rc1 - 1.9.5           |   1.5.0 - 1.5.6
1.9.0-rc1 & 1.9.0           |   1.4.10 - 1.4.12
1.8.5                       |   1.3.9 - 1.4.9
1.8.4                       |   1.3.7 & 1.3.8
1.8.3                       |   1.3.6
1.8.1 & 1.8.2               |   1.3.5
1.8                         |   1.3
1.7                         |   1.2.5

Легкий способ найти mockito и powermock-mockito версию с помощью maven,

mvn dependency:tree | grep mockito
[INFO] |  \- org.mockito:mockito-core:jar:1.8.5:compile
[INFO] +- org.mockito:mockito-all:jar:1.8.5:compile
[INFO] +- org.powermock:powermock-api-mockito:jar:1.4.9:compile

Проблемой могут быть конфликтующие версии mockito в приложении и те, которые powermockito использует, конфликтуя, как показано ниже, в моем случае, когда я использую powermock 1.6.5, который не поддерживает mockito 1.8.5

mvn clean dependency:tree | grep mockito
[INFO] +- org.mockito:mockito-all:jar:1.8.5:compile

[INFO] \- org.powermock:powermock-api-mockito:jar:1.6.5:compile
[INFO]    +- org.mockito:mockito-core:jar:1.10.19:compile
[INFO]    \- org.powermock:powermock-api-mockito-common:jar:1.6.5:compile

Ответ 3

У меня был

          org.mockito           Mockito-все           1.8.4

добавлен в мой pom.xml отдельно от зависимости от powermock, удаление этого сработало для меня.

Ответ 4

Для меня, в Eclipse, исправление этой проблемы было найдено в пути Java Build Path. Перейдите на вкладку "Заказ и экспорт". Переместите библиотеки веб-приложений на внизу. Обратите внимание, что при необходимости это также позволит вам просматривать источники сторонних библиотек, когда Eclipse сообщает вам, что источник не найден.

Ответ 5

В моем случае это была конфликтная зависимость. Я исправил это после исключения артефакта mockito-core:

 <dependency>
        <groupId>com.googlecode.catch-exception</groupId>
        <artifactId>catch-exception</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
            </exclusion>
        </exclusions>
        <version>1.0.4</version>
        <scope>test</scope>
    </dependency>