PowerMock and Java security initialization

6,936 views
Skip to first unread message

Bremse

unread,
Nov 13, 2009, 6:34:00 AM11/13/09
to PowerMock
Problem consists in failure when attempting to get default SSLContext:
sslcontext = SSLContext.getDefault(); or SSLContext.getInstance
("SSLv3");

Test class annotations are:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeStaticClass.class)

During test executing system needs to get SSLContext. This results in
general failure with the following exception

java.security.NoSuchAlgorithmException: class configured for
SSLContext: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl not a
SSLContext
at sun.security.jca.GetInstance.checkSuperClass(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at javax.net.ssl.SSLContext.getInstance(Unknown Source)
at javax.net.ssl.SSLContext.getDefault(Unknown Source)
at com.mitateknik.scheduler.TestSchedulerFacade.test2
(TestSchedulerFacade.java:328)
at com.mitateknik.scheduler.TestSchedulerFacade.setUp
(TestSchedulerFacade.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod
(BeforeAndAfterRunner.java:74)
at org.junit.internal.runners.BeforeAndAfterRunner.runBefores
(BeforeAndAfterRunner.java:50)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected
(BeforeAndAfterRunner.java:33)
at org.junit.internal.runners.TestMethodRunner.runMethod
(TestMethodRunner.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation
(WhiteboxImpl.java:1506)
at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod
(WhiteboxImpl.java:713)
at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod
(WhiteboxImpl.java:672)
at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:440)
at
org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestMethodRunner.run
(PowerMockJUnit4LegacyTestMethodRunner.java:67)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod
(TestClassMethodsRunner.java:66)
at
org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestClassMethodsRunner.run
(PowerMockJUnit4LegacyTestClassMethodsRunner.java:97)
at
org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunnerDelegateImpl
$1.runUnprotected(PowerMockJUnit4LegacyRunnerDelegateImpl.java:69)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected
(BeforeAndAfterRunner.java:34)
at
org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunnerDelegateImpl.run
(PowerMockJUnit4LegacyRunnerDelegateImpl.java:85)
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:44)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run
(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run
(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run
(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
(RemoteTestRunner.java:196)


Further debugging shows that exception is thrown somewhere inside of
SSL initialization:
java.lang.NumberFormatException
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.<init>(Unknown Source)
at sun.net.InetAddressCachePolicy.<clinit>(Unknown Source)
at java.net.InetAddress$Cache.getPolicy(Unknown Source)
at java.net.InetAddress$Cache.put(Unknown Source)
at java.net.InetAddress.cacheInitIfNeeded(Unknown Source)
at java.net.InetAddress.cacheAddress(Unknown Source)
at java.net.InetAddress.getAddressFromNameService(Unknown Source)
at java.net.InetAddress.getLocalHost(Unknown Source)
at sun.security.provider.SeedGenerator$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.provider.SeedGenerator.getSystemEntropy(Unknown
Source)
at sun.security.provider.SecureRandom.engineNextBytes(Unknown Source)
at java.security.SecureRandom.nextBytes(Unknown Source)
at java.security.SecureRandom.next(Unknown Source)
at java.util.Random.nextInt(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLContextImpl.engineInit(Unknown
Source)
at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(Unknown
Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown
Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown
Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at java.security.Provider$Service.newInstance(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at javax.net.ssl.SSLContext.getInstance(Unknown Source)
at javax.net.ssl.SSLContext.getDefault(Unknown Source)
at com.mitateknik.scheduler.TestSchedulerFacade.test2
(TestSchedulerFacade.java:328)
at com.mitateknik.scheduler.TestSchedulerFacade.setUp
(TestSchedulerFacade.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod
(BeforeAndAfterRunner.java:74)
at org.junit.internal.runners.BeforeAndAfterRunner.runBefores
(BeforeAndAfterRunner.java:50)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected
(BeforeAndAfterRunner.java:33)
at org.junit.internal.runners.TestMethodRunner.runMethod
(TestMethodRunner.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation
(WhiteboxImpl.java:1506)
at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod
(WhiteboxImpl.java:713)
at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod
(WhiteboxImpl.java:672)
at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:440)
at
org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestMethodRunner.run
(PowerMockJUnit4LegacyTestMethodRunner.java:67)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod
(TestClassMethodsRunner.java:66)
at
org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestClassMethodsRunner.run
(PowerMockJUnit4LegacyTestClassMethodsRunner.java:97)
at
org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunnerDelegateImpl
$1.runUnprotected(PowerMockJUnit4LegacyRunnerDelegateImpl.java:69)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected
(BeforeAndAfterRunner.java:34)
at
org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunnerDelegateImpl.run
(PowerMockJUnit4LegacyRunnerDelegateImpl.java:85)
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:44)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run
(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run
(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run
(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
(RemoteTestRunner.java:196)

Does somebody have any idea what I'm doing wrong and what could be
done to resolve the issue above.

Johan Haleby

unread,
Nov 13, 2009, 6:47:59 AM11/13/09
to powe...@googlegroups.com
This is most likely because SSLContext is loaded by the bootstrap classloader and PowerMock cannot byte-code manipulate these classes. You have to use this approach to mock that method.

/Johan

Bremse

unread,
Nov 15, 2009, 7:03:35 AM11/15/09
to PowerMock
Thank you for reply,
but I do not need to mock SSLContext. I mocked different class and
SSLContext is simply used in tests and I wanted to use it "as is".
Does your answer mean that I should obligatory mock system class
SSLContext independent on the fact do I need it (mocking) or not?

/Borys

On Nov 13, 1:47 pm, Johan Haleby <johan.hal...@gmail.com> wrote:
> This is most likely because SSLContext is loaded by the bootstrap
> classloader and PowerMock cannot byte-code manipulate these classes. You
> have to use this
> <http://code.google.com/p/powermock/wiki/MockSystem>approach to mock
> > org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerM­ockJUnit4LegacyTestMethodRunner.run
> > (PowerMockJUnit4LegacyTestMethodRunner.java:67)
> >        at
> > org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod
> > (TestClassMethodsRunner.java:66)
> >        at
>
> > org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerM­ockJUnit4LegacyTestClassMethodsRunner.run
> > (PowerMockJUnit4LegacyTestClassMethodsRunner.java:97)
> >        at
>
> > org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunn­erDelegateImpl
> > $1.runUnprotected(PowerMockJUnit4LegacyRunnerDelegateImpl.java:69)
> >        at org.junit.internal.runners.BeforeAndAfterRunner.runProtected
> > (BeforeAndAfterRunner.java:34)
> >        at
>
> > org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunn­erDelegateImpl.run
> > (PowerMockJUnit4LegacyRunnerDelegateImpl.java:85)
> >        at
>
> > org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImp­l.run
> > (JUnit4TestSuiteChunkerImpl.java:112)
> >        at
>
> > org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRu­nner.run
> > org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerM­ockJUnit4LegacyTestMethodRunner.run
> > (PowerMockJUnit4LegacyTestMethodRunner.java:67)
> >        at
> > org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod
> > (TestClassMethodsRunner.java:66)
> >        at
>
> > org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerM­ockJUnit4LegacyTestClassMethodsRunner.run
> > (PowerMockJUnit4LegacyTestClassMethodsRunner.java:97)
> >        at
>
> > org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunn­erDelegateImpl
> > $1.runUnprotected(PowerMockJUnit4LegacyRunnerDelegateImpl.java:69)
> >        at org.junit.internal.runners.BeforeAndAfterRunner.runProtected
> > (BeforeAndAfterRunner.java:34)
> >        at
>
> > org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunn­erDelegateImpl.run
> > (PowerMockJUnit4LegacyRunnerDelegateImpl.java:85)
> >        at
>
> > org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImp­l.run
> > (JUnit4TestSuiteChunkerImpl.java:112)
> >        at
>
> > org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRu­nner.run
> > (AbstractCommonPowerMockRunner.java:44)
> >        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run
> > (JUnit4TestReference.java:45)
> >        at org.eclipse.jdt.internal.junit.runner.TestExecution.run
> > (TestExecution.java:38)
> >        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
> > (RemoteTestRunner.java:460)
> >        at
>
> ...
>
> read more »- Hide quoted text -
>
> - Show quoted text -

Johan Haleby

unread,
Nov 16, 2009, 2:10:25 AM11/16/09
to powe...@googlegroups.com
Hi,

No you don't need to mock SSLContext unless you want to of course. I suppose that TestSchedulerFacade (line 328) for some reason interacts with the SSLContext class. I suppose that the problem may be because that the SSLContext#getDefault tries to look something up from the thread classloader (which is the PowerMock classloader when you run the tests). Either you have to instruct the SSLContext to load a particular implementation or use @PowerMockIgnore (see #4 in the FAQ) to make it load by the bootstrap classloader.

/Johan
Reply all
Reply to author
Forward
0 new messages