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)
I have the same problem as @PolinaBevad with OpenJDK11
@michaelpog did you try with powermock
2.0.0-beta.5
and mockito22.18.0
?I had a similar issue (nearly identical stack trace) and the following worked for me:
First PowerMockIgnore did not work for me.
When I added wildcard for each ignore then it worked.
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:
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:
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 { }
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