[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [equinox-dev] Testing OSGI Bundles with JUnit
|
oh.. yes.. you don't use maven, so you don't have transient dependencies in.
Well, yes, then the initial quote of the required artifacts you need
at compiletime are a bit more. We just listed the direct dependencies.
There are some more dependencies like ops4j-base (your current exception).
I will try to compile a flat list of dependencies with their
respective download urls.
Sorry for inconvinience.
For impatient: you *could* add a pom to your test project, specify the
pax exam dependencies as in the tutorial from the wiki and see what
you get when doing "mvn eclipse:eclipse"
DevCon: Yes, will be there, also with a short talk about Pax Exam.
On 5/19/09, David Conde <dconde@xxxxxxxx> wrote:
> Hi Toni,
>
> Thank you so much for your answer.
>
> If I did not misunderstand, there are a lot of things done by Pax Exam which
> are transparent to users, so just fixing a couple of configuration
> parameters I could get a context similar to the real one with Equinox.
>
>
> I am exactly not using PDE with Eclipse, what I am doing the most of times
> is to use Eclipse like a tool to create my bundles in a easier way and then
> I export them as a jar files, in order to install them by console in Equinox
> framework (using console, not Eclipse running environment). In this way I
> have to install all of bundles by myself, so, if I am using a bundle which
> use a service from OSGi, which is not included in EQuinox.jar I have to
> download it and install as well.
>
> I removed felix and knopflerfish from configuration part as you said, and I
> added :
>
> provision(
> //
> bundle( "file:PlatformConfigurationImpl_1.0.0.jar"
> ),
> bundle( "file:PlatformConfiguration_1.0.0.jar" )
>
> )
>
> These URLs are the names of my bundles, their symbolic names, and when I
> launch this class from console the result is the same, I do not get
> anything, however, if I launch from Eclipse click on "Run botton", two
> options appear: Run as JUnit Test and Run as Junit Plug-in Test. If I lauch
> the first one I get "initialization error" with the next exceptions:
>
>
>
> java.lang.NoClassDefFoundError: org/ops4j/lang/NullArgumentException
> at
> org.ops4j.pax.exam.junit.internal.DefaultConfigMethod.<init>(DefaultConfigMe
> thod.java:68)
> at
> org.ops4j.pax.exam.junit.AnnotatedWithConfiguration.getConfigMethods(Annotat
> edWithConfiguration.java:68)
> at
> org.ops4j.pax.exam.junit.JUnit4TestRunner.getConfigurationMethods(JUnit4Test
> Runner.java:137)
> at
> org.ops4j.pax.exam.junit.JUnit4TestRunner.getTestMethods(JUnit4TestRunner.ja
> va:92)
> at
> org.ops4j.pax.exam.junit.JUnit4TestRunner.<init>(JUnit4TestRunner.java:80)
> 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
> org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.ja
> va:31)
> at
> org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder
> .java:24)
> at
> org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:
> 57)
> at
> org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(Al
> lDefaultPossibilitiesBuilder.java:29)
> at
> org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:
> 57)
> at
> org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
> at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4Test
> Reference.java:26)
> at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit
> 4TestClassReference.java:24)
> at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4Tes
> tLoader.java:40)
> at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4Test
> Loader.java:30)
> at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRu
> nner.java:445)
> at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRu
> nner.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)
> Caused by: java.lang.ClassNotFoundException:
> org.ops4j.lang.NullArgumentException
> at java.net.URLClassLoader$1.run(Unknown Source)
> at java.security.AccessController.doPrivileged(Native Method)
> at java.net.URLClassLoader.findClass(Unknown Source)
> at java.lang.ClassLoader.loadClass(Unknown Source)
> at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
> at java.lang.ClassLoader.loadClass(Unknown Source)
> at java.lang.ClassLoader.loadClassInternal(Unknown Source)
> ... 23 more
>
>
>
>
> I do not really know what I am missing. In my Scenario, there are two
> bundles, one of them it is an interface, and the other one is the
> implementation of that interface.
> The only thing that my implementation do it is add new properties or remove
> them, using PreferenceService from OSGI.
> This implementation make use of PreferenceService from the framework, so it
> is like an internal bundle which I do not have Access to, I mean, it may be
> that I have to include this bundle in "provision part", but the problem is
> that I do not have this PreferenceService.jar.
>
>
> Launching as JUnit Plug-in Test (second option) I did not get any result.
>
> Do I need to include any other bundle in "provision part"?
>
>
> Any idea?
>
> Thank you in advance.
>
> I am writing all these steps so that I can write a tutorial about this work.
>
> By the way, yes I am from Spain, and I would like to go to OSGI DevCon in
> Zurich but I will be working in this date. Will you go there?
>
>
> Thank you again!
>
>
> David
> -----Mensaje original-----
> De: equinox-dev-bounces@xxxxxxxxxxx [mailto:equinox-dev-bounces@xxxxxxxxxxx]
> En nombre de Toni Menzel
> Enviado el: martes, 19 de mayo de 2009 13:18
> Para: Equinox development mailing list
> Asunto: Re: [equinox-dev] Testing OSGI Bundles with JUnit
>
> Hi David,
>
> let me see. First your configuration is _all_ what your osgi bundle
> context will look like. So, currently you specify three frameworks
> (felix,equinox,knopflerfish). This will start all three frameworks
> after each other and execute your test inside each of them.
> To get started and learn the stuff its probably easier to just specify
> one framework (equinox for this matter).
>
> Now, all resources you have in your test-classes output (most of it
> are usually your compiled testcases) are bundled up into a bundle with
> a fully managed manifest (you cannot control). This is what we call
> the "test probe" and exist just to have the test inside the osgi
> environment.
>
> Now, you launch the test just like an ordinary JUnit test (which it
> is, from eclipse point of view).
>
> This should trigger Pax Exam to download everything necessary (more on
> that below), launch a new vm per framework, start the framework,
> install you "test probe", and trigger the test from inside eclipse via
> an rmi remote hook.
>
> Now, in your case it will not find your Service (Test will fail)
> because you test setup is mostly empty. As i mentioned, the what you
> define inside the @Configuration method (returning array of Option)
> defines your whole test setup: your target vm, your osgi framework +
> version, your bundles.
>
> For target vm you have a default (your JAVA_HOME vm), for framework
> you have specified felix,equiniox and knopflerfish (for test, just
> keep one for now).
> But, you did not mention your bundle.
> Now, there are many ways on how you can do this.
> Simpliest way is if you bundle is a maven artifact, then you can do
> (inside options(..)):
> mavenBundle().groupId("foo").artifactId("bar").version("1.0.0")
>
> If not, you can use basically any url:
> bundle(String URL)
>
> If you really want to keep using PDE, you can do this then:
> bundle("file:mybundle.jar")
> or so.
>
> Your configuration then looks like this:
> public static Option[] configuration()
> {
> return options(
> equinox(),
> provision(
> bundle("yourbundleurl"),
> bundle("probablyanotherurl"),
> )
> );
> }
>
> To answer the last question about the activator for the test probe:
> no, there's no way. (by design if you want. Same for manifest entries.
> The Test Probe is not something you should rely on. You can assume
> that your injected bundlecontext is a valid BundleContext. And you can
> rely on that all your stuff from your test folder will be inside that
> test probe.
> Finally, the test probe has a (calculated by bytecode inspection)
> import-package part with all resolution=optional.
>
> Tell us about your experience.
>
> Sure, a detailed howto for eclipse/PDE users would be great. ;)
>
> I see you are from spain, do you intend to come to OSGi DevCon in
> Zurich , June, 22nd ?
>
> cheers,
> Toni
>
> #
> On 5/19/09, David Conde <dconde@xxxxxxxx> wrote:
>> Hi,
>>
>>
>>
>> Thanks Alin for your answer.
>>
>>
>>
>> I have tried what you told me in your email.
>>
>>
>>
>> I have downloaded
>>
>>
>>
>> * <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam>
>> pax-exam
>> *
>> <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-junit>
>> pax-exam-junit
>> *
>>
> <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-container-de
>> fault> pax-exam-container-default
>>
>>
>>
>> and I followed : http://wiki.ops4j.org//x/f4Cr
>> <http://wiki.ops4j.org/x/f4Cr> .
>>
>>
>>
>> These were my steps:
>>
>> 1. I added the jars previously mentioned in ClassPath (Environment
>> Variables)
>>
>> 2. I created a MyTestClass as shown below:
>>
>>
>>
>> import ….
>>
>>
>>
>> @RunWith( JUnit4TestRunner.class )
>>
>> public class MyUnitTest
>>
>> {
>>
>>
>>
>> @Inject
>>
>> BundleContext bundleContext;
>>
>>
>>
>> @Configuration
>>
>> public static Option[] configuration()
>>
>> {
>>
>> return options(
>>
>> frameworks(
>>
>> felix(),
>>
>> equinox(),
>>
>> knopflerfish()
>>
>> )
>>
>>
>>
>> );
>>
>> }
>>
>>
>>
>> private ServiceTracker tracker;
>>
>> @Test
>>
>> public void testMethod()
>>
>> throws Exception
>>
>> {
>>
>> tracker = new ServiceTracker(bundleContext,
>> MyServicetobeTEsted.class.getName(), null);
>>
>> tracker.open();
>>
>>
>>
>> MyServicetobeTEsted service = (MyServicetobeTEsted)
>> tracker.getService();
>>
>>
>>
>> org.junit.Assert.assertTrue(service.addValue("Nivel", 5));
>>
>>
>>
>>
>>
>> }
>>
>>
>>
>> }
>>
>>
>>
>> 3. I have exported my TestProject in Eclipse as a jar or bundle(I
> did
>> this in the same way I exported my other Bundles using Eclipse, I mean, I
>> have exported my TestProject, which have a package where there is just one
>> class (MyUnitTest), and there is no Activator class at all.
>>
>> 4. I have launched Equinox with MyServicetobeTEsted already
> installed
>>
>> 5. I have installed my TestProject Bundle
>>
>> 6. I have started my TestProject bundle but I did not get any result
>> at all. I do not get any exception neither.
>>
>>
>>
>>
>>
>>
>>
>> Am I missing anything?
>>
>>
>>
>> I have some questions about Pax Exam now:
>>
>>
>>
>> -Is it possible to get with Pax Exam the same Visual Interface than JUnit
>> uses?
>>
>> -Where do I get the result from testing?
>>
>> -Do I have to create Activator class with start method to my TestClass?
>>
>>
>>
>> What does it mean that I have to built the TESTBUNDLE on the fly?
>> Thank you in advance
>>
>>
>>
>> David
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> De: equinox-dev-bounces@xxxxxxxxxxx
> [mailto:equinox-dev-bounces@xxxxxxxxxxx]
>> En nombre de Alin Dreghiciu
>> Enviado el: viernes, 15 de mayo de 2009 22:57
>> Para: Equinox development mailing list
>> Asunto: Re: [equinox-dev] Testing OSGI Bundles with JUnit
>>
>>
>>
>> I think an user guide for using Px Exam with Eclipse will be very useful.
> If
>> Toni does not do it before me, I will during this weekend.
>>
>> Till then the what you can do is to:
>>
>> 1. Add this jars to your classpath (take latest)
>>
>> * <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam>
>> pax-exam
>> *
>> <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-junit>
>> pax-exam-junit
>> *
>>
> <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-container-de
>> fault> pax-exam-container-default
>>
>> 2. Follow http://wiki.ops4j.org//x/f4Cr <http://wiki.ops4j.org/x/f4Cr> .
>>
>>
>>
>> On Fri, May 15, 2009 at 11:42 AM, David Conde <dconde@xxxxxxxx> wrote:
>>
>>
>> Hi Toni,
>>
>> Thank you for your idea!
>>
>> I have Reading about Pax Exam and I am not clear about what exactly I
> have
>> to do for installing and using it in Equinox.
>>
>> I would like to test a simple Bundle which uses Preference Service from
>> Equinox. I do not use neither Maven nor other containers, just Equinox
> v34.
>>
>> As I have read in Pax Exam website, If I want to test my Bundle I should
>> create a Test Class similar to T1S2_HowToUseBundleContext example, I
>> thought, my Test Class should implements TestCase class but I do not see
> any
>> TestCase implementation in examples so I suppose that using "@RunWith(
>> JUnit4TestRunner.class )" it is enough. I asume either that I should also
>> include the next piece of code inside to fix Equinox as framework:
>>
>> @Configuration
>> public Option[] configure() {
>> return options(
>> equinox()
>> );
>> }
>>
>> Either I would have to fix @test in each method which I would like to
> test.
>>
>> Finally I suppose that I would have to add pax-exam-junit.jar from
>>
> (http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-junit/0.5.0/
>> ) and junit.jar from (JUnit website) to the classpath.
>>
>> So if I am not wrong, the steps to test a Bundle in Equinox would be like
> as
>> shown below:
>>
>> 1-Include pax-exam-junit.jar and junit.jar in ClassPath
>> 2-Create a new Bundle which will create a MyTestClass instance (with
>> “@RunWith( JUnit4TestRunner.class )" included.
>> 3-Call to Preference Service from BundleContext object as the same way as
> I
>> did using the real Context in real bundles.
>> 4- Launch Equinox with all the Bundles
>>
>> And now, my questions are? HOw BundleContext can call to
>> bundleContext.getBundles method if it was defined as null in
>> T1S2_HowToUseBundleContext example?
>>
>> Could I call for example
>> bundleContext.getService(“PreferenceServiceReference”)?
>>
>>
>> I either would like to ask about the results, how do I get test results?
> Is
>> it possible to use junit.swingui.TestRunner in order to get results as a
>> visual interface?
>>
>>
>> Thank you in advance
>>
>> David
>>
>> -----Mensaje original-----
>> De: equinox-dev-bounces@xxxxxxxxxxx
> [mailto:equinox-dev-bounces@xxxxxxxxxxx]
>> En nombre de Toni Menzel
>> Enviado el: jueves, 14 de mayo de 2009 12:06
>> Para: Equinox development mailing list
>> Asunto: Re: [equinox-dev] Testing OSGI Bundles with JUnit
>>
>>
>> Have you had a look at pax exam
>> (http://wiki.ops4j.org/display/paxexam/Pax+Exam) ?
>>
>> It actually lets you write Junit Tests in OSGi Framework independent way.
>> You finally wrap your test in a test probe bundle (built on the fly),
>> start your target framework (equinox in this case), provision it with
>> you setup (extra bundles), and thats about it.
>>
>> IF you use PDE (because you pointed to the fact you are using eclipse
>> a couple of times):
>> Without external means like maven you probably end up re-specifiying
>> all your dependencies again just for test setup.
>>
>> Tell us if you do or not as it might help us a lot to get you started
>> with pax exam.
>>
>> Finally, in exam you end up inside an isolated vm process running just
>> your test vm with your test framework
>> (Equinox,Felix,Knopflerfish,Concierge, all recent versions at you
>> fingertipps) exactly as specified. From there you (currently) get the
>> (real!) bundleContext from where you probably get any service you
>> want.
>>
>> Toni
>>
>>
>>
>>
>> On 5/14/09, David Conde <dconde@xxxxxxxx> wrote:
>>> Hi everyone,
>>>
>>>
>>>
>>> I am trying to do test cases for OSGI Bundles in Equinox, using Eclipse.
> I
>>> found the problem when I tried to model BundleContext and services like
>>> Preference Services, which are complex objects. I read about how I could
>>> solve this problem and I found some libraries from Spring Framework which
>>> use “mocks” to test BundleContext, but I am not sure if these ones
>> provided
>>> special Services likes Preference services. So, my question is , is there
>>> any library with mocks to simulate BundleContext and other complex
> Equinox
>>> classes? Is there any library provided by Equinox?
>>>
>>>
>>>
>>> Thank you in advance
>>>
>>>
>>>
>>>
>>>
>>> --
>>>
>>> David Conde Baena
>>>
>>>
>>> CITIC
>>> Centro Andaluz de Innovación y Tecnologías de la Información y las
>>> Comunicaciones
>>> Edificio CITIC, C/ Marie Curie, 6
>>> Parque Tecnológico de Andalucía
>>> 29590 - Campanillas (MÁLAGA)
>>>
>>> Tfno.: +34 952028610
>>> Fax: +34 951231029
>>> <mailto:usuario@xxxxxxxx> Email: dconde@xxxxxxxx
>>> <http://www.citic.es/> Web: www.citic.es
>>>
>>>
>>>
>>>
>>>
>>>
>>
>>
>> --
>> Toni Menzel
>> Independent Software Developer - Looking for new projects!
>> Professional Profile: http://www.osgify.com
>> Blog: tonitcom.blogspot.com
>> toni@xxxxxxxxxxxxxxx
>> http://www.ops4j.org - New Energy for OSS Communities - Open
>> Participation Software.
>> _______________________________________________
>> equinox-dev mailing list
>> equinox-dev@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/equinox-dev
>>
>> _______________________________________________
>> equinox-dev mailing list
>> equinox-dev@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/equinox-dev
>>
>>
>>
>>
>> --
>> Alin Dreghiciu
>> Software Developer - Looking for new projects!
>> My profile: http://www.linkedin.com/in/alindreghiciu
>> My blog: http://adreghiciu.blogspot.com
>> http://www.ops4j.org - New Energy for OSS Communities - Open Participation
>> Software.
>> http://www.qi4j.org - New Energy for Java - Domain Driven Development.
>>
>>
>
>
> --
> Toni Menzel
> Independent Software Developer - Looking for new projects!
> Professional Profile: http://www.osgify.com
> Blog: tonitcom.blogspot.com
> toni@xxxxxxxxxxxxxxx
> http://www.ops4j.org - New Energy for OSS Communities - Open
> Participation Software.
> _______________________________________________
> equinox-dev mailing list
> equinox-dev@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/equinox-dev
>
> _______________________________________________
> equinox-dev mailing list
> equinox-dev@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/equinox-dev
>
--
Toni Menzel
Independent Software Developer - Looking for new projects!
Professional Profile: http://www.osgify.com
Blog: tonitcom.blogspot.com
toni@xxxxxxxxxxxxxxx
http://www.ops4j.org - New Energy for OSS Communities - Open
Participation Software.