cannot create a mock of java.util.ServiceLoader

1,736 views
Skip to first unread message

fortran

unread,
Apr 1, 2011, 10:39:12 AM4/1/11
to PowerMock
Hi,

I am trying to mock the ServiceLoader, and I'm getting this exception:

java.lang.IllegalAccessError: java.lang.Class
at
sun.reflect.GeneratedSerializationConstructorAccessor9.newInstance(Unknown
Source)
at java.lang.reflect.Constructor.newInstance(Constructor.java:
513)
at
org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:
56)
at
org.powermock.reflect.internal.WhiteboxImpl.newInstance(WhiteboxImpl.java:
257)
at org.powermock.reflect.Whitebox.newInstance(Whitebox.java:
139)
at
org.powermock.core.DefaultFieldValueGenerator.instantiateFieldType(DefaultFieldValueGenerator.java:
74)
at
org.powermock.core.DefaultFieldValueGenerator.fillWithDefaultValues(DefaultFieldValueGenerator.java:
51)
at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:
2146)
at
org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:98)
at
SystemPropertyMockDemoTest.demoOfFinalSystemClassMocking3(SystemPropertyMockDemoTest.java:
49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl
$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:
322)
at org.junit.internal.runners.MethodRoadie
$2.run(MethodRoadie.java:86)
at
org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:
94)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl
$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:
309)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl
$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:
112)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl
$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:
73)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl
$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:
297)
at
org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
at
org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:
222)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:
161)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl
$1.run(PowerMockJUnit44RunnerDelegateImpl.java:135)
at
org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:
34)
at
org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:
44)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:
133)
at
org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:
112)
at
org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:
57)
at
org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:
62)
at
org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:
140)
at
org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:
127)
at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:
345)
at
org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:
1009)



Examining the stack trace, I'm guessing that the problem is when the
mock is populating its fields with default values, and cannot
instantiate a Class<?> field.

Is there any way to skip that step or to inject a proper Class value
so I can avoid the error?

Thanks!

Johan Haleby

unread,
Apr 3, 2011, 11:45:28 AM4/3/11
to powe...@googlegroups.com
That seems to have been a bug in PowerMock. It has been fixed and committed to trunk, please verify it if you like. Thanks for reporting.

/Johan


--
You received this message because you are subscribed to the Google Groups "PowerMock" group.
To post to this group, send email to powe...@googlegroups.com.
To unsubscribe from this group, send email to powermock+...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/powermock?hl=en.


fortran

unread,
Apr 4, 2011, 3:43:47 AM4/4/11
to PowerMock
Thanks! I was thinking this was more like a feature rather than a bug
^_^

Anyway, in the end I found a workaround. I used a valid instance
created by the factory method of ServiceLoader and then just mocked
the method I needed in my test; it seemed to work just fine.

Thanks again!



On Apr 3, 5:45 pm, Johan Haleby <johan.hal...@gmail.com> wrote:
> That seems to have been a bug in PowerMock. It has been fixed and committed
> to trunk, please verify it if you like. Thanks for reporting.
>
> /Johan
>

Johan Haleby

unread,
Apr 4, 2011, 3:58:56 AM4/4/11
to powe...@googlegroups.com
I'm glad to hear that you found a work-around until the next version is released.

/Johan
Reply all
Reply to author
Forward
0 new messages