On 7/31/12 09:35 , Björn Pollex wrote:
Hello Everyone!
I have developed a small bundle that can create mocks using Mockito
and register these as services. The problem is that sometimes I get
mysterious exceptions:
ERROR: JarContent: Unable to read bytes.
(java.lang.IllegalStateException: zip file closed)
java.lang.IllegalStateException: zip file closed
at java.util.zip.ZipFile.ensureOpen(ZipFile.java:415)
at java.util.zip.ZipFile.getEntry(ZipFile.java:160)
at
org.apache.felix.framework.util.ZipFileX.getEntry(ZipFileX.java:52)
at
org.apache.felix.framework.cache.JarContent.getEntryAsBytes(JarContent.java:122)
at
org.apache.felix.framework.ModuleImpl$ModuleClassLoader.findClass(ModuleImpl.java:1856)
at
org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:752)
at
org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
at
org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at
org.mockito.internal.configuration.ClassPathLoader.loadConfiguration(ClassPathLoader.java:20)
at
org.mockito.internal.configuration.GlobalConfiguration.createConfig(GlobalConfiguration.java:38)
at
org.mockito.internal.configuration.GlobalConfiguration.<init>(GlobalConfiguration.java:32)
at
org.mockito.internal.configuration.GlobalConfiguration.validate(GlobalConfiguration.java:47)
at
org.mockito.internal.progress.MockingProgressImpl.validateMostStuff(MockingProgressImpl.java:81)
at
org.mockito.internal.progress.MockingProgressImpl.validateState(MockingProgressImpl.java:68)
at
org.mockito.internal.progress.ThreadSafeMockingProgress.validateState(ThreadSafeMockingProgress.java:49)
at org.mockito.internal.MockHandler.handle(MockHandler.java:71)
at
org.mockito.internal.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:36)
at
org.mockito.internal.creation.MethodInterceptorFilter.intercept(MethodInterceptorFilter.java:48)
at
de.younicos.osgi.testutilities.mocks.fooservice.Foo$$EnhancerByMockitoWithCGLIB$$56fd3ef0.finalize(<generated>)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
I do not exactly know what causes it, and it seems to happen randomly.
In some cases a similar error happens when verification of mock fails,
which results in the termination of the entire test-run (which
effectively makes this approach unusable). I figured this was some
kind of class-loading conflict between OSGi and Mockito, so I tried to
provide Mockito via boot-delegation to make sure it always available
everywhere.
These sorts of errors generally happen when threads are left running on
bundles that have been closed/refreshed.
-> richard
When running my test, Pax Exam shows the following logs (excerpt):
[...]
15:00:46.082 [main] DEBUG o.o.p.e.n.i.NativeTestContainer -
org.osgi.framework.bootdelegation = sun.*,org.mockito,org.mockito.*
You should use "org.mockito,org.mockito.*" since the wildcard only
matches subpackages.
-> richard
[...]
15:00:46.082 [main] DEBUG o.o.p.e.n.i.NativeTestContainer -
java.class.path = [...]C:\Dokumente und
Einstellungen\pollexb\.m2\repository\org\mockito\mockito-all\1.9.0\mockito-all-1.9.0.jar;[...]
So, boot-delegation is set up correctly, and Mockito appears to be on
the class-path. Yet, none of the bundles using Mockito can load any
class from any of these bundles:
java.lang.NoClassDefFoundError: org/mockito/Mockito
at
de.younicos.osgi.testutilities.MockProvider.createRequestedMocks(MockProvider.java:73)
at
de.younicos.osgi.testutilities.MockProvider.start(MockProvider.java:63)
at
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
at
org.apache.felix.framework.Felix.activateBundle(Felix.java:1904)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)
at
org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1192)
at
org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:266)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassNotFoundException: org.mockito.Mockito
not found by de.younicos.osgi.testutilities.MockProvider [19]
at
org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
at
org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:72)
at
org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 8 more
The delegation happens (I verified it with the debugger), only the
boot-classloader cannot find the packages. Can anyone explain why that
is?
As an alternative, I have tried providing all the packages using the
systemPackages-option (which is probably the cleaner option anyway).
When doing this it gets really strange. The first test I run, always
works as expected. That means, if I run all of my tests individually
(e.g. by commenting out the others), all tests pass. If I run more
than one test, only the first one works as expected, and all the
others fail, because the mock is not created. The bundle that should
create the mocks throws this exception:
java.lang.ClassCastException
at java.lang.Class.cast(Class.java:2990)
at
org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:51)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:52)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:41)
at org.mockito.Mockito.mock(Mockito.java:1014)
at org.mockito.Mockito.mock(Mockito.java:909)
at
de.younicos.osgi.testutilities.MockProvider.createRequestedMocks(MockProvider.java:74)
at
de.younicos.osgi.testutilities.MockProvider.start(MockProvider.java:64)
at
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629)
at
org.apache.felix.framework.Felix.activateBundle(Felix.java:1904)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)
at
org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1192)
at
org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:266)
at java.lang.Thread.run(Thread.java:662)
I am at a complete loss to explain this behavior. Does anyone have any
ideas?
The problem is rather complex, but if it help, I will take the time to
create a test-project on GitHub. I would have done that anyway, since
my plan was to use this bundle as a basis for adding built-in
service-mocking to Pax Exam (I will post a proposal for this soonish,
once I fixed this problem).
I would be glad for any pointer anyone could provide.
Greetings,
Björn Pollex
_______________________________________________
general mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/general
_______________________________________________
general mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/general