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>