powermock: Power mock is not working with JDK 9, Getting initializationError(PowermockTest): java.lang.reflect.InvocationTargetException

Hi I have a test project that uses Powermock https://github.com/michaelpog/powermocktest When I try to build this project with maven on JDK 8, it builds and runs the unit tests just fine.

However when I run it with JDK 9, I’m getting this failure

initializationError(PowermockTest)  Time elapsed: 0.006 sec  <<< ERROR!
org.objenesis.ObjenesisException: java.lang.reflect.InvocationTargetException
        at org.objenesis.instantiator.sun.SunReflectionFactoryHelper.newConstructorForSerialization(SunReflectionFactoryHelper.java:54)
        at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.<init>(SunReflectionFactoryInstantiator.java:41)
        at org.objenesis.strategy.StdInstantiatorStrategy.newInstantiatorOf(StdInstantiatorStrategy.java:67)
        at org.objenesis.ObjenesisBase.getInstantiatorOf(ObjenesisBase.java:94)
        at org.powermock.reflect.internal.WhiteboxImpl.newInstance(WhiteboxImpl.java:259)
        at org.powermock.reflect.Whitebox.newInstance(Whitebox.java:139)
        at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.getPowerMockTestListenersLoadedByASpecificClassLoader(AbstractTestSuiteChunkerImpl.java:95)
        at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:174)
        at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:48)
        at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:108)
        at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:71)
        at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:36)
        at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:34)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
        at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
        at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
        at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
        at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
        at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
        at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:250)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.objenesis.instantiator.sun.SunReflectionFactoryHelper.newConstructorForSerialization(SunReflectionFactoryHelper.java:44)
        ... 34 more
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
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1007)
        at org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:262)
        at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:206)
        at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass1(DeferSupportingClassLoader.java:89)
        at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:79)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1007)
        at org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:262)
        at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:206)
        at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass1(DeferSupportingClassLoader.java:89)
        at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:79)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
        at java.base/jdk.internal.misc.Unsafe.defineClass0(Native Method)
        at java.base/jdk.internal.misc.Unsafe.defineClass(Unsafe.java:1173)
        at java.base/jdk.internal.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
        at java.base/jdk.internal.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:400)
        at java.base/jdk.internal.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/jdk.internal.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)
        at java.base/jdk.internal.reflect.MethodAccessorGenerator.generateSerializationConstructor(MethodAccessorGenerator.java:112)
        at java.base/jdk.internal.reflect.ReflectionFactory.generateConstructor(ReflectionFactory.java:434)
        at java.base/jdk.internal.reflect.ReflectionFactory.newConstructorForSerialization(ReflectionFactory.java:404)
        at jdk.unsupported/sun.reflect.ReflectionFactory.newConstructorForSerialization(ReflectionFactory.java:103)
        ... 39 more


Results :

Tests in error: 
  initializationError(PowermockTest): java.lang.reflect.InvocationTargetException

Please see the exact steps to reproduce in this reproducer https://github.com/michaelpog/powermocktest Thank you

About this issue

  • Original URL
  • State: open
  • Created 6 years ago
  • Reactions: 11
  • Comments: 17 (1 by maintainers)

Most upvoted comments

I have the same problem as @PolinaBevad with OpenJDK11

@michaelpog did you try with powermock 2.0.0-beta.5 and mockito2 2.18.0?

I had a similar issue (nearly identical stack trace) and the following worked for me:

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>2.18.0</version>
</dependency>

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-api-mockito2</artifactId>
  <version>2.0.0-beta.5</version>
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4</artifactId>
  <version>2.0.0-beta.5</version>
</dependency>

First PowerMockIgnore did not work for me.

When I added wildcard for each ignore then it worked.

@PowerMockIgnore({ "javax.management.*", "com.sun.org.apache.xerces.*", "javax.xml.*",
        "org.xml.*", "org.w3c.dom.*", "com.sun.org.apache.xalan.*", "javax.activation.*" })

It also got rid of all the java.lang.NoClassDefFoundError.

Have the same issue on PowerMock version 2.0.0-beta.5 on Java 10.0.1 with exception while mocking static methods. PowerMock version 2.0.0-beta.5 working only if I also add new versions of net.bytebuddy libraries. So my dependencies are:

testCompile 'org.powermock:powermock-api-mockito2:2.0.0-beta.5'
testCompile 'org.powermock:powermock-module-testng:2.0.0-beta.5'
testCompile 'net.bytebuddy:byte-buddy:1.8.3'
testCompile 'net.bytebuddy:byte-buddy-agent:1.8.3'

Maybe it will help someone. With this two additional dependencies exception dissapear and tests are passed, but I still have a warning in the log:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.powermock.reflect.internal.WhiteboxImpl (file:/home/vardict/.gradle/caches/modules-2/files-2.1/org.powermock/powermock-reflect/2.0.0-beta.5/4ea415348f15620783a1f26343d6732adfa86bc8/powermock-reflect-2.0.0-beta.5.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.powermock.reflect.internal.WhiteboxImpl
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

Hope it will be fixed soon…

Hi,

There is some sort of supporting JKD 9 in beta versions of PowerMock 2.0. I’m not going to implement supporting Java 9 or 10 in the PowerMock 1.x

Right now the project is in frozen state because I do not have enough time. I hope I will be able to return back to project soon.

Best Regards, Arthur Zagretdinov

On 19 Apr 2018, at 22:50, michaelpog <notifications@github.commailto:notifications@github.com> wrote:

@thekingnothinghttps://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fthekingnothing&data=02|01||50eb5f341b9244531bff08d5a63f823a|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|636597714046457219&sdata=012yCPfr%2Ft%2BdCECOmCmP5T%2FdnfLc2N6OQo%2Ft8ukDCkc%3D&reserved=0 I was wondering if Powermock is undergoing any development to support JDK 9+? Thank you

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fpowermock%2Fpowermock%2Fissues%2F901%23issuecomment-382891672&data=02|01||50eb5f341b9244531bff08d5a63f823a|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|636597714046457219&sdata=78g95wBNXO3sl%2BztVPrjwrrVAHVSaSWhXZM7okTlp%2Fw%3D&reserved=0, or mute the threadhttps://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FAMkKANZagQVVjaax-Yici07fBMHv69bDks5tqQaJgaJpZM4TZFLD&data=02|01||50eb5f341b9244531bff08d5a63f823a|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|636597714046457219&sdata=WS4au1Zk1osuMYRRu4YBMS6zvwjoQ0kwDtt1U4uiYoQ%3D&reserved=0.

When I upgraded to Jdk 11, I got this exception and a couple of other exceptions. I gathered work arounds from multiple pages and finally worked from me. Do these three steps:

  • As mentioned in this page, update power mockito version to 2.0.0-beta.5 and mockito version to 2.18.0 (yes both of them. I used 2.0.2 for power mockito and 2.18.0 for mockito).

  • On top of each test class that uses power mockito, add the following annotation: @PowerMockIgnore({“javax.management.", "com.sun.org.apache.xerces.”, “javax.xml.", "org.xml.”, “org.w3c.dom.", "com.sun.org.apache.xalan.”, “javax.activation.*”})

If you have a base class that all your test classes extends, you’ll only need to change that base class only! For example:

@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 { }

<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.24.1-GA</version> <scope>test</scope> </dependency>

Those three steps together worked for me and all tests are passing now!

Anybody found the solution yet? I have the same issue with Java11