J'essaie de me moquer d'un constructeur en utilisant PowerMockito
mais à chaque fois que je lance le test, l'erreur suivante apparaît:
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)
J'ai les dépendances PowerMock suivantes dans mon projet:
J'ai tracé l'arbre de dépendance de mon projet et résolu les conflits afin que mockito-all:1.9.5
soit inclus dans la construction.
Mon problème était dû aux versions conflictuelles de javassist dans les dépendances (transitives) de mon projet. Ce que j'ai fait était de rechercher toutes les dépendances qui mettaient l'ancienne version de javassist dans la construction, puis de les exclure. Par exemple:
<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>
Assurez-vous que les versions powermockito
et mockito
sont alignées comme dans ce tableau de versions - MockitoUsage # supported-versions ,
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
Un moyen facile de trouver la version mockito
et powermock-mockito
en utilisant maven est,
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
Le problème pourrait provenir des versions conflictuelles de mockito
dans l'application et de celle utilisée par powermockito
, en conflit comme ci-dessous dans le cas où j'utilise powermock 1.6.5
qui ne prend pas en charge 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
J'ai eu
org.mockito mockito-tous 1.8.4
ajouté à mon pom.xml en dehors des dépendances de powermock, le fait de le supprimer fonctionnait pour moi.
Pour moi, dans Eclipse, le correctif de ce problème a été trouvé dans Java Build Path. Cliquez sur l'onglet Order and Export. Déplacez les bibliothèques d'applications Web vers en bas . Notez que, le cas échéant, cela vous permettra également d’afficher la source des bibliothèques tierces lorsque Eclipse vous indiquera que la source est introuvable.
Dans mon cas, il s’agissait d’une dépendance aux conflits .
<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>