Je suis en train de migrer un projet vers Java9, les tests commencent à échouer après que je suis passé à la nouvelle version Java, il semble que PowerMock essaie d'accéder à certaines classes auxquelles il n'a pas accès) .
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.973 sec <<< FAILURE! - in com.Test
initializationError(com.Test) Time elapsed: 0.007 sec <<< ERROR!
org.objenesis.ObjenesisException: Java.lang.reflect.InvocationTargetException
Caused by: Java.lang.reflect.InvocationTargetException
Caused by: Java.lang.IllegalAccessError: class jdk.internal.reflect.ConstructorAccessorImpl loaded by org/powermock/core/classloader/MockClassLoader cannot access jdk/internal/reflect superclass jdk.internal.reflect.MagicAccessorImpl
plugin maven-surefire
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<includes>
<include>**/*Test.Java</include>
<include>**/*Test.groovy</include>
<include>**/*Spec.*</include>
</includes>
<forkMode>always</forkMode>
<argLine>--add-modules Java.xml.bind</argLine>
<argLine>--add-modules Java.activation</argLine>
<argLine>--add-opens=Java.base/Java.lang=ALL-UNNAMED --illegal-access=warn</argLine>
</configuration>
</plugin>
dépendance Powermock
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.4</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
</exclusion>
</exclusions>
</dependency>
C'est un (actuellement) problème ouvert @powermock , mais pour Java 9 cela devrait fonctionner:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.18.0</version> <!-- or higher, correspondning to powermock-version -->
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.0-beta.5</version> <!-- or higher -->
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.0-beta.5</version> <!-- or higher -->
</dependency>
Voir: https://github.com/powermock/powermock/issues/901#issuecomment-385533096
Avec Java 11, Mosheer-Ahmad a réussi à exécuter ses tests, avec:
org.javassist javassist 3.24.1-GA test
etcette classe (base de test)/annotations:
@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"javax.management.", "com.Sun.org.Apache.xerces.",
"javax.xml.", "org.xml.", "org.w3c.dom.",
"com.Sun.org.Apache.xalan.", "javax.activation.*"})
public class PowerMockitoBaseRunner {
}
.
J'ai eu une dépendance de test sur un pot tiers qui utilisait Powermock. Afin de résoudre cette erreur, j'ai dû ajouter:
@PowerMockIgnore("jdk.internal.reflect.*")
À la classe testée avec powermock
Comme @ smac89 l'a mentionné, tout ce que j'avais à faire était d'ignorer le paquet incriminé.
En annotant ma classe de test avec @PowerMockIgnore("jdk.internal.reflect.*")
Mes dépendances Maven sont:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
Version Java:
Java -version
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
Juste pour réitérer le très bon argument du sghaier ALi.
L'ajout de * aux classes ignorées a résolu le problème.
les changements effectués sont:
Les dépendances suivantes dans build.gradle:
testImplementation 'org.mockito: mockito-core: 3.3.3'
testImplementation 'org.powermock: powermock-api-mockito2: 2.0.5'
testImplementation 'org.powermock: powermock-module-junit4: 2.0.5'
annoter la classe spécifique avec:
@ PowerMockIgnore ({"javax.management .", "com.Sun.org.Apache.xerces.", "javax.xml .", "org. xml. "," org.w3c.dom ."," com.Sun.org.Apache.xalan. "," javax.activation. * "})