blob: aa7540ff82e1343f778a120666e7a24d2a8c1703 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE- 2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<head>
<title>Apache Felix - apache-felix-ipojo-junit4osgi-tutorial</title>
<link rel="icon" href="/res/favicon.ico">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="The most powerful component model for OSGi">
<link href="/ipojo/web/bootstrap/css/bootstrap-cerulean.css" rel="stylesheet">
<link href="/ipojo/web/bootstrap/css/bootstrap-responsive.css" rel="stylesheet">
<link href="/ipojo/web/bootstrap/css/font-awesome.min.css" rel="stylesheet">
<link href="/ipojo/web/style.css" rel="stylesheet">
<!-- Overide alert's colors -->
<link href="/ipojo/web/bootstrap/css/alert.css" rel="stylesheet">
<link rel="stylesheet" href="/ipojo/web/github.css" type="text/css" media="all">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="/ipojo/web/bootstrap/js/bootstrap.min.js"></script>
</head>
<body data-spy="scroll" data-target=".subnav">
<div class="navbar navbar-fixed-top navbar-inverse">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="/documentation/subprojects/apache-felix-ipojo.html">Apache Felix iPOJO</a>
<div class="nav-collapse" id="main-menu">
<ul class="nav" id="main-menu-left">
<li><a href="/documentation/subprojects/apache-felix-ipojo/ipojo-news.html">News</a></li>
<li><a href="http://felix.apache.org/downloads.cgi">Downloads</a></li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Tutorials <b class="caret"></b></a>
<ul class="dropdown-menu" id="tutorials-menu">
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-why-choose-ipojo.html">Why choose iPOJO</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-successstories.html">Success stories</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-feature-overview.html">Features</a></li>
<li class="divider"></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-gettingstarted/ipojo-in-10-minutes.html">iPOJO in 10 minutes</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-gettingstarted/how-to-use-ipojo-annotations.html">Using Annotations</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-gettingstarted/ipojo-hello-word-maven-based-tutorial.html">Maven tutorial</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-gettingstarted/ipojo-advanced-tutorial.html">Advanced tutorial</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-gettingstarted/apache-felix-ipojo-dosgi.html">Using Distributed OSGi</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-gettingstarted/ipojo-composition-tutorial.html">Application Composition</a></li>
</ul>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Documentation <b class="caret"></b></a>
<ul class="dropdown-menu" id="user-guide-menu">
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/service-requirement-handler.html">Requiring a service</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/providing-osgi-services.html">Providing a service</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/lifecycle-callback-handler.html">Lifecycle management</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/configuration-handler.html">Configuration</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/architecture-handler.html">Introspection</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/controller-lifecycle-handler.html">Impacting the lifecycle</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/injecting-bundle-context.html">Accessing the Bundle Context</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/apache-felix-ipojo-instances.html">Creating instances</a></li>
<li class="divider"></li>
<li class="dropdown-submenu">
<a tabindex="-1" href="#">External <em>handlers</em></a>
<ul class="dropdown-menu">
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/event-admin-handlers.html">Asynchronous communication</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/ipojo-jmx-handler.html">JMX management</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/extender-pattern-handler.html">Extender pattern</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/white-board-pattern-handler.html">Whiteboard pattern</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/temporal-service-dependency.html">Temporal dependencies</a></li>
</ul>
</li>
<li class="dropdown-submenu">
<a tabindex="-1" href="#">Configuration Admin &amp; Factories</a>
<ul class="dropdown-menu">
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/combining-ipojo-and-configuration-admin.html">iPOJO and config admin</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/ipojo-factory-service.html">Using the iPOJO Factory service</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/how-to-use-ipojo-factories.html">Factories and Instances</a></li>
</ul>
</li>
<li class="divider"></li>
<li class="dropdown-submenu">
<a tabindex="-1" href="#">Advanced topics</a>
<ul class="dropdown-menu">
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/instance-vs-service-controller.html">Instance vs. Service Controllers</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/service-binding-interceptors.html">Service Binding Interceptors</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/using-xml-schemas.html">XML Schemas</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/apache-felix-ipojo-api.html">Using the iPOJO API</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/constructing-pojo-objects-with-factory-methods.html">Constructing service objects with factory methods</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/using-ipojo-introspection-api.html">Using the introspection API</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-testing-components.html">Testing components</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/using-stereotypes.html">Using @Stereotypes</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-eclipse-integration.html">Eclipse Integration</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/ipojo-extender-configuration.html">Configuring iPOJO's Extender</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-faq.html">FAQ</a></li>
<li class="divider"></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-devguide/how-to-write-your-own-handler.html">Handler development</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-devguide/how-to-use-ipojo-manipulation-metadata.html">Manipulation Metadata </a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-devguide/dive-into-the-ipojo-manipulation-depths.html">Dive into the iPOJO Manipulation depths</a></li>
<li><a href="http://felix.apache.org/ipojo/api/1.12.1">Javadoc</a></li>
</ul>
</li>
</ul>
</li>
<li class="dropdown" id="tools-menu">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Tools <b class="caret"></b></a>
<ul class="dropdown-menu" id="swatch-menu">
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-tools/ipojo-ant-task.html">Ant Task</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-tools/ipojo-maven-plug-in.html">Maven Plugin</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-tools/ipojo-arch-command.html">Architecture commands</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-tools/apache-felix-ipojo-online-manipulator.html">Online Manipulator</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-tools/ipojo-webconsole-plugin.html">Webconsole plugin</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-tools/ipojo-karaf-feature.html">Apache Karaf Features</a></li>
</ul>
</li>
<li class="dropdown" id="community-menu">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Community <b class="caret"></b></a>
<ul class="dropdown-menu" id="swatch-menu">
<li><a href="/documentation/subprojects/apache-felix-ipojo/ipojo-support.html">Support</a></li>
<li><a href="http://www.apache.org/">ASF</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html">Sponsors</a></li>
</ul>
</li>
<li class="dropdown" id="misc-menu">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Misc <b class="caret"></b></a>
<ul class="dropdown-menu" id="swatch-menu">
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-supportedvms.html">Supported JVMs</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-supportedosgi.html">Supported OSGi Implementations</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/articles-and-presentations.html">Article & Presentations</a></li>
<li><a href="/documentation/subprojects/apache-felix-ipojo/developing-camel-mediators-with-ipojo.html">Developping Camel mediators with iPOJO</a></li>
</ul>
</li>
</ul>
<ul class="nav pull-right" id="main-menu-right">
<li><a rel="tooltip" target="_blank" href="http://felix.apache.org">Apache Felix <i class="icon-share-alt"></i></a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container">
<div class="content">
<style type="text/css">
/* The following code is added by mdx_elementid.py
It was originally lifted from http://subversion.apache.org/style/site.css */
/*
* Hide class="elementid-permalink", except when an enclosing heading
* has the :hover property.
*/
.headerlink, .elementid-permalink {
visibility: hidden;
}
h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
<h1 id="junit4osgi-quick-start">junit4osgi quick start<a class="headerlink" href="#junit4osgi-quick-start" title="Permanent link">&para;</a></h1>
<p><em>This page describes how using the junit4osgi framework. With the archive tutorial, a pre-configured version of Felix (with the test framework already installed) is also provided.</em></p>
<p div="div">{div:class=toc}
[TOC]</p>
<h2 id="getting-junit4osgi">Getting JUnit4OSGi<a class="headerlink" href="#getting-junit4osgi" title="Permanent link">&para;</a></h2>
<p>The JUnit4OSGi framework is available from the <a href="http://felix.apache.org/site/downloads.cgi">Felix downloads</a>. Source code is also available in the iPOJO sub-project ([sources|Download]). The JUnit4OSGi framework and the different launchers are built when you compile Felix.</p>
<h2 id="how-to-run-test">How to run test?<a class="headerlink" href="#how-to-run-test" title="Permanent link">&para;</a></h2>
<p>Firs of all to execute test you must deploy in your OSGi container:
1. Your tests
1. The junit4osgi runtime (executing tests)
1. A runner launching tests</p>
<p>Several runner are available:
<em> You can use the JUnit4OSGi immediate-runner, which run tests contained in all the test-bundles. The results are displayed in the framework console output.
</em> The JUnit4OSGi Felix Command (available only for the Apache Felix OSGi framework), allows you to run tests contained in a specific bundle. Test results are also displayed in the framework console output. The syntax of the command is very simple :
<strong> To run tests contained in the bundle with the given id :<code>{noformat}junit &lt;bundle id&gt;{noformat</code>}
</strong> To run tests contained in all the test-bundles installed in the framework :<code>junit all</code>
* The JUnit4OSGi Swing GUI lets you select the test cases and test suites to execute and shows you graphically the result of the tests. You can double-click on a test case result to show its details.</p>
<p>!http://felix.apache.org/site/apache-felix-ipojo-junit4osgi.data/screenshot-junit4ogsi-swing-runner.PNG!</p>
<h2 id="testcase-testsuite">TestCase, TestSuite<a class="headerlink" href="#testcase-testsuite" title="Permanent link">&para;</a></h2>
<p>A test case is an environment (made of conditions and variables) under which a tester will check that a requirement is satisfied. For JUnit, test cases are classes that define several test methods ; each test method tests an aspect of the targeted requirement. Test cases are often collected into test suites. A test suite aggregates several test cases (and even other test suites), including the notion of test hierarchy. Tests can be organized according to the different requirements they try to validate. The skeleton of a JUnit <code>TestCase</code> and <code>TestSuite</code> is shown just above :</p>
<div class="codehilite"><pre><span class="cm">/**</span>
<span class="cm"> * The skeleton of a JUnit test case</span>
<span class="cm"> */</span>
<span class="n">public</span> <span class="k">class</span> <span class="n">MyTestCase</span> <span class="k">extends</span> <span class="n">junit</span><span class="p">.</span><span class="n">framework</span><span class="p">.</span><span class="n">TestCase</span> <span class="p">{</span>
<span class="p">...</span>
<span class="n">public</span> <span class="k">void</span> <span class="n">setUp</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// Performs actions BEFORE running any test case.</span>
<span class="p">}</span>
<span class="n">public</span> <span class="k">void</span> <span class="n">testSomething</span><span class="p">()</span> <span class="n">throws</span> <span class="n">AnyException</span> <span class="p">{</span>
<span class="c1">// A test method</span>
<span class="p">...</span>
<span class="n">assertTrue</span><span class="p">(</span><span class="n">myTest</span><span class="p">);</span>
<span class="n">assertEquals</span><span class="p">(</span><span class="n">myValue</span><span class="p">,</span> <span class="n">expectedValue</span><span class="p">);</span>
<span class="p">...</span>
<span class="p">}</span>
<span class="n">public</span> <span class="k">void</span> <span class="n">testAnotherThing</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// Another test method</span>
<span class="p">...</span>
<span class="p">}</span>
<span class="n">public</span> <span class="k">void</span> <span class="n">tearDown</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// Performs actions AFTER running all test cases.</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="cm">/**</span>
<span class="cm"> * The skeleton of a JUnit test suite</span>
<span class="cm"> */</span>
<span class="n">public</span> <span class="k">class</span> <span class="n">MyTestSuite</span> <span class="k">extends</span> <span class="n">junit</span><span class="p">.</span><span class="n">framework</span><span class="p">.</span><span class="n">TestSuite</span> <span class="p">{</span>
<span class="cm">/**</span>
<span class="cm"> * The skeleton of a JUnit test suite</span>
<span class="cm"> */</span>
<span class="n">public</span> <span class="k">static</span> <span class="n">Test</span> <span class="n">suite</span><span class="p">()</span> <span class="p">{</span>
<span class="n">TestSuite</span> <span class="n">suite</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TestSuite</span><span class="p">(</span><span class="s">&quot;The name of the test suite&quot;</span><span class="p">);</span>
<span class="n">suite</span><span class="p">.</span><span class="n">addTestSuite</span><span class="p">(</span><span class="n">MyTestCase</span><span class="p">.</span><span class="k">class</span><span class="p">);</span>
<span class="n">suite</span><span class="p">.</span><span class="n">addTestSuite</span><span class="p">(</span><span class="n">AnotherTestCase</span><span class="p">.</span><span class="k">class</span><span class="p">);</span>
<span class="p">...</span>
<span class="k">return</span> <span class="n">suite</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>First, tests methods are declared in the test case. Their name must begin with "test", so JUnit will execute them on demand. The test are expressed in terms of JUnit assertions ; the <code>assert*()</code> methods causes JUnit test failure if the given assertion is false. The setUp() and tearDown() methods perform specific actions before and after test cases are run. Then, the test suite collect various test cases. It must implement the <code>suite()</code> method that returns the global (and organized) test suite to JUnit.</p>
<h2 id="osgitestcase-and-osgitestsuite">OSGiTestCase and OSGiTestSuite<a class="headerlink" href="#osgitestcase-and-osgitestsuite" title="Permanent link">&para;</a></h2>
<p>An OSGi test case, is a test case that runs in an OSGi context. <code>OSGiTestCase</code> is the class that all the OSGi test cases you write must extend. This class is a kind of bridge between the JUnit TestCase class and the OSGi environment. The only thing the <code>OSGiTestCase</code> class adds is the access to the bundle context of the bundle containing tests, and some utility methods, giving an easy access to other bundles and services registered in the OSGi framework.</p>
<p>The structure of an <code>OSGiTestCase</code> is exactly the same as a classic JUnit <code>TestCase</code> :</p>
<div class="codehilite"><pre> <span class="o">/**</span>
<span class="o">*</span> <span class="n">The</span> <span class="n">structure</span> <span class="n">of</span> <span class="n">an</span> <span class="n">OSGiTestCase</span>
<span class="o">*/</span>
<span class="n">public</span> <span class="n">class</span> <span class="n">MyOSGiTestCase</span> <span class="n">extends</span> <span class="n">OSGiTestCase</span> <span class="p">{</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">setUp</span><span class="p">()</span> <span class="p">{...}</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">testSomething</span><span class="p">()</span> <span class="p">{</span>
<span class="o">//</span> <span class="n">You</span> <span class="n">can</span> <span class="n">access</span> <span class="n">here</span> <span class="n">the</span> <span class="n">bundle</span> <span class="n">context</span> <span class="n">through</span>
<span class="o">//</span> <span class="n">the</span> <span class="s">&#39;getContext()&#39;</span> <span class="n">method</span>
<span class="n">getContext</span><span class="p">().</span><span class="n">getServiceReference</span><span class="p">(...);</span>
<span class="p">...</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">testAnotherThing</span><span class="p">()</span> <span class="p">{...}</span>
<span class="p">...</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">tearDown</span><span class="p">()</span> <span class="p">{...}</span>
<span class="p">}</span>
</pre></div>
<p>By extension, OSGi test suites are collections of OSGi test cases. But you can also add classic JUnit test cases inside your <code>OSGiTestSuite</code>. The skeleton of an OSGiTestSuite is globally the same as a TestSuite, except the fact that a reference to the bundle context is passed :</p>
<div class="codehilite"><pre><span class="n">public</span> <span class="n">class</span> <span class="n">MyOSGiTestSuite</span> <span class="p">{</span>
<span class="o">/**</span>
<span class="o">*</span> <span class="n">This</span> <span class="n">method</span> <span class="n">returns</span> <span class="n">the</span> <span class="n">suite</span> <span class="n">of</span> <span class="n">tests</span> <span class="n">to</span> <span class="n">run</span><span class="p">.</span>
<span class="o">*/</span>
<span class="n">public</span> <span class="n">static</span> <span class="n">Test</span> <span class="n">suite</span><span class="p">(</span><span class="n">BundleContext</span> <span class="n">bc</span><span class="p">)</span> <span class="p">{</span>
<span class="n">OSGiTestSuite</span> <span class="n">suite</span> <span class="p">=</span> <span class="n">new</span> <span class="n">OSGiTestSuite</span><span class="p">(</span>&quot;<span class="n">My</span> <span class="n">OSGi</span> <span class="n">test</span> <span class="n">suite</span>&quot;<span class="p">,</span> <span class="n">bc</span><span class="p">);</span>
<span class="n">suite</span><span class="p">.</span><span class="n">addTestSuite</span><span class="p">(</span><span class="n">MyFirstTest</span><span class="p">.</span><span class="n">class</span><span class="p">);</span>
<span class="n">suite</span><span class="p">.</span><span class="n">addTestSuite</span><span class="p">(</span><span class="n">MySecondTest</span><span class="p">.</span><span class="n">class</span><span class="p">);</span>
<span class="p">...</span>
<span class="o">//</span> <span class="n">Here</span><span class="p">,</span> <span class="n">we</span> <span class="n">add</span> <span class="n">a</span> <span class="n">sub</span> <span class="n">test</span> <span class="n">suite</span> <span class="n">in</span> <span class="n">this</span> <span class="n">test</span> <span class="n">suite</span><span class="p">.</span>
<span class="n">suite</span><span class="p">.</span><span class="n">addTest</span><span class="p">(</span><span class="n">AnotherTestSuite</span><span class="p">.</span><span class="n">suite</span><span class="p">(</span><span class="n">bc</span><span class="p">));</span>
<span class="p">...</span>
<span class="k">return</span> <span class="n">suite</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<h2 id="how-to-declare-test-suites">How to declare test suites<a class="headerlink" href="#how-to-declare-test-suites" title="Permanent link">&para;</a></h2>
<p>This section explains how to declare your test suites in order to expose them to the JUnit4OSGi bundle.</p>
<p>The written OSGi test suites must be declared by the bundle containing them. To do so, you define add the Test-Suite property in your bundle's header. The following snippets show you how to configure your bundle generation tool to add this property in the header. You can even declare test cases in it. The Junit4OSGi bundle will detect such an header in installed bundle (using the extender pattern) and execute contained tests on demand.</p>
<p>With the maven-bundle-plugin, add the following lines in your project's pom :</p>
<div class="codehilite"><pre><span class="nt">&lt;plugin&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.apache.felix<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>maven-bundle-plugin<span class="nt">&lt;/artifactId&gt;</span>
...
<span class="nt">&lt;extensions&gt;</span>true<span class="nt">&lt;/extensions&gt;</span>
<span class="nt">&lt;configuration&gt;</span>
<span class="nt">&lt;instructions&gt;</span>
...
<span class="c">&lt;!-- Declare here the test cases and test suites of your bundle --&gt;</span>
<span class="nt">&lt;Test-Suite&gt;</span>
a.package.MyFirstTestSuite,
yet.another.package.MySingleTestCase
...
<span class="nt">&lt;/Test-Suite&gt;</span>
<span class="nt">&lt;/instructions&gt;</span>
<span class="nt">&lt;/configuration&gt;</span>
<span class="nt">&lt;/plugin&gt;</span>
</pre></div>
<p>With the aQute Bnd Ant task, add the following lines in your project bnd file:</p>
<div class="codehilite"><pre><span class="n">Test</span><span class="o">-</span><span class="n">Suite</span><span class="p">:</span> <span class="n">a</span><span class="p">.</span><span class="n">package</span><span class="p">.</span><span class="n">MyFirstTestSuite</span><span class="p">,</span> <span class="n">yet</span><span class="p">.</span><span class="n">another</span><span class="p">.</span><span class="n">package</span><span class="p">.</span><span class="n">MySingleTestCase</span><span class="p">,</span> <span class="p">...</span>
</pre></div>
<h2 id="quick-examples">Quick examples<a class="headerlink" href="#quick-examples" title="Permanent link">&para;</a></h2>
<p>The following examples show you how to perform unitary tests on your OSGi platform. The first example recovers the example given in the JUnit Cookbook, "bundlizes" it so tests can be run in an OSGi environment. None of the JUnit4OSGi specific features is used, but it shows how to adapt classic JUnit tests. The second example is more OSGi-oriented, and shows how a unitary test can access to the framework via its bundle context.</p>
<p>These examples can be downloaded <a href="http://people.apache.org/~clement/ipojo/tutorials/junit4osgi/junit4osgi-tutorial.zip">here</a>.</p>
<h3 id="bundles-to-deploy-to-use-junit4osgi">Bundles to deploy to use junit4osgi<a class="headerlink" href="#bundles-to-deploy-to-use-junit4osgi" title="Permanent link">&para;</a></h3>
<p>If you don't use the archive, you can deploy the junit4osgi framework manually. Here is the list of the bundles to deploy and start:
<em> org.apache.felix.ipojo-1.6.0.jar: iPOJO Core bundle
</em> org.apache.felix.ipojo.handler.extender-1.6.0.jar: iPOJO Extender pattern handler
<em> org.apache.felix.ipojo.junit4osgi-1.1.0-SNAPSHOT.jar: the JUnit4OSGi framework
</em> org.apache.felix.ipojo.junit4osgi.felix-command-1.1.0-SNAPSHOT.jar: the command line junit4osgi runner</p>
<h3 id="the-remixed-junit-example">The remixed JUnit example<a class="headerlink" href="#the-remixed-junit-example" title="Permanent link">&para;</a></h3>
<p>This example is a simple conversion of a classic JUnit example derived from the JUnit Cookbook. The test case and the test suite are shown to remind you JUnit principles.</p>
<div class="codehilite"><pre><span class="n">package</span> <span class="n">junit</span><span class="p">.</span><span class="n">example</span><span class="p">;</span>
<span class="n">import</span> <span class="n">junit</span><span class="p">.</span><span class="n">framework</span><span class="p">.</span><span class="n">TestCase</span><span class="p">;</span>
<span class="n">import</span> <span class="n">junit</span><span class="p">.</span><span class="n">money</span><span class="p">.</span><span class="n">Money</span><span class="p">;</span>
<span class="n">public</span> <span class="n">class</span> <span class="n">SimpleTestCase</span> <span class="n">extends</span> <span class="n">TestCase</span> <span class="p">{</span>
<span class="n">private</span> <span class="n">Money</span> <span class="n">f12CHF</span><span class="p">;</span>
<span class="n">private</span> <span class="n">Money</span> <span class="n">f14CHF</span><span class="p">;</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">setUp</span><span class="p">()</span> <span class="p">{</span>
<span class="n">f12CHF</span><span class="p">=</span> <span class="n">new</span> <span class="n">Money</span><span class="p">(</span>12<span class="p">,</span> &quot;<span class="n">CHF</span>&quot;<span class="p">);</span>
<span class="n">f14CHF</span><span class="p">=</span> <span class="n">new</span> <span class="n">Money</span><span class="p">(</span>14<span class="p">,</span> &quot;<span class="n">CHF</span>&quot;<span class="p">);</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">testEquals</span><span class="p">()</span> <span class="p">{</span>
<span class="n">assertTrue</span><span class="p">(</span>!<span class="n">f12CHF</span><span class="p">.</span><span class="n">equals</span><span class="p">(</span><span class="n">null</span><span class="p">));</span>
<span class="n">assertEquals</span><span class="p">(</span><span class="n">f12CHF</span><span class="p">,</span> <span class="n">f12CHF</span><span class="p">);</span>
<span class="n">assertEquals</span><span class="p">(</span><span class="n">f12CHF</span><span class="p">,</span> <span class="n">new</span> <span class="n">Money</span><span class="p">(</span>12<span class="p">,</span> &quot;<span class="n">CHF</span>&quot;<span class="p">));</span>
<span class="n">assertTrue</span><span class="p">(</span>!<span class="n">f12CHF</span><span class="p">.</span><span class="n">equals</span><span class="p">(</span><span class="n">f14CHF</span><span class="p">));</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">testSimpleAdd</span><span class="p">()</span> <span class="p">{</span>
<span class="n">Money</span> <span class="n">expected</span><span class="p">=</span> <span class="n">new</span> <span class="n">Money</span><span class="p">(</span>26<span class="p">,</span> &quot;<span class="n">CHF</span>&quot;<span class="p">);</span>
<span class="n">Money</span> <span class="n">result</span><span class="p">=</span> <span class="n">f12CHF</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">f14CHF</span><span class="p">);</span>
<span class="n">assertTrue</span><span class="p">(</span><span class="n">expected</span><span class="p">.</span><span class="n">equals</span><span class="p">(</span><span class="n">result</span><span class="p">));</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">package</span> <span class="n">junit</span><span class="p">.</span><span class="n">example</span><span class="p">;</span>
<span class="n">import</span> <span class="n">junit</span><span class="p">.</span><span class="n">framework</span><span class="p">.</span><span class="n">Test</span><span class="p">;</span>
<span class="n">import</span> <span class="n">junit</span><span class="p">.</span><span class="n">framework</span><span class="p">.</span><span class="n">TestSuite</span><span class="p">;</span>
<span class="n">public</span> <span class="n">class</span> <span class="n">SimpleTestSuite</span> <span class="p">{</span>
<span class="n">public</span> <span class="n">static</span> <span class="n">Test</span> <span class="n">suite</span><span class="p">()</span> <span class="p">{</span>
<span class="n">TestSuite</span> <span class="n">suite</span> <span class="p">=</span> <span class="n">new</span> <span class="n">TestSuite</span><span class="p">(</span>&quot;<span class="n">Money</span> <span class="n">Simple</span> <span class="n">Test</span> <span class="n">Suite</span>&quot;<span class="p">);</span>
<span class="n">suite</span><span class="p">.</span><span class="n">addTestSuite</span><span class="p">(</span><span class="n">SimpleTestCase</span><span class="p">.</span><span class="n">class</span><span class="p">);</span>
<span class="k">return</span> <span class="n">suite</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>The following bnd file declares the test suite in the target bundle's header :</p>
<div class="codehilite"><pre><span class="n">Private</span><span class="o">-</span><span class="n">Package</span><span class="p">:</span> <span class="n">junit</span><span class="p">.</span><span class="n">money</span><span class="p">,</span> <span class="n">junit</span><span class="p">.</span><span class="n">example</span>
<span class="n">Test</span><span class="o">-</span><span class="n">Suite</span><span class="p">:</span> <span class="n">junit</span><span class="p">.</span><span class="n">example</span><span class="p">.</span><span class="n">SimpleTestSuite</span>
</pre></div>
<p>Once built, the bundle must be deployed in the provided Felix framework, and tests can be performed using the <code>'junit'</code> command :</p>
<div class="codehilite"><pre> <span class="o">-&gt;</span> <span class="n">ps</span>
<span class="n">START</span> <span class="n">LEVEL</span> 1
<span class="n">ID</span> <span class="n">State</span> <span class="n">Level</span> <span class="n">Name</span>
<span class="p">...</span>
<span class="p">[</span> 12<span class="p">]</span> <span class="p">[</span><span class="n">Active</span> <span class="p">]</span> <span class="p">[</span> 1<span class="p">]</span> <span class="n">Junit</span><span class="o">-</span><span class="n">Example</span> <span class="p">(</span>0<span class="p">)</span>
<span class="p">...</span>
<span class="o">-&gt;</span> <span class="n">junit</span> 12
<span class="n">Executing</span> <span class="p">[</span><span class="n">Money</span> <span class="n">Simple</span> <span class="n">Test</span> <span class="n">Suite</span><span class="p">]</span>
<span class="p">..</span>
<span class="n">Time</span><span class="p">:</span> 0
<span class="n">OK</span> <span class="p">(</span>2 <span class="n">tests</span><span class="p">)</span>
<span class="o">-&gt;</span>
</pre></div>
<p>As you can see above, all tests have been correctly executed !</p>
<h2 id="an-osgi-based-junit-example">An OSGi-based JUnit example<a class="headerlink" href="#an-osgi-based-junit-example" title="Permanent link">&para;</a></h2>
<p>This example shows you how to interact with the OSGi framework within your tests. The test bundle provide a service (HelloService) and tests its work normally. To get the service reference of the HelloService, it uses the bundle context field of the OSGiTestCase class (named <code>'context'</code>) and interacts with it like any other OSGi bundle does.</p>
<div class="codehilite"><pre><span class="n">package</span> <span class="n">junit</span><span class="p">.</span><span class="n">example</span><span class="p">;</span>
<span class="n">import</span> <span class="n">junit</span><span class="p">.</span><span class="n">service</span><span class="p">.</span><span class="n">hello</span><span class="p">.</span><span class="n">HelloService</span><span class="p">;</span>
<span class="n">import</span> <span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">felix</span><span class="p">.</span><span class="n">ipojo</span><span class="p">.</span><span class="n">junit4osgi</span><span class="p">.</span><span class="n">OSGiTestCase</span><span class="p">;</span>
<span class="n">import</span> <span class="n">org</span><span class="p">.</span><span class="n">osgi</span><span class="p">.</span><span class="n">framework</span><span class="p">.</span><span class="n">ServiceReference</span><span class="p">;</span>
<span class="n">public</span> <span class="n">class</span> <span class="n">SimpleTestCase</span> <span class="n">extends</span> <span class="n">OSGiTestCase</span> <span class="p">{</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">testHelloAvailability</span><span class="p">()</span> <span class="p">{</span>
<span class="n">ServiceReference</span> <span class="n">ref</span> <span class="p">=</span> <span class="n">getServiceReference</span><span class="p">(</span><span class="n">HelloService</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">());</span>
<span class="n">assertNotNull</span><span class="p">(</span>&quot;<span class="n">Assert</span> <span class="n">Availability</span>&quot;<span class="p">,</span> <span class="n">ref</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">testHelloAvailability2</span><span class="p">()</span> <span class="p">{</span>
<span class="n">ServiceReference</span> <span class="n">ref</span> <span class="p">=</span> <span class="n">getServiceReference</span><span class="p">(</span><span class="n">HelloService</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">(),</span> <span class="n">null</span><span class="p">);</span>
<span class="n">assertNotNull</span><span class="p">(</span>&quot;<span class="n">Assert</span> <span class="n">Availability</span>&quot;<span class="p">,</span> <span class="n">ref</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">testHelloMessage</span><span class="p">()</span> <span class="p">{</span>
<span class="n">ServiceReference</span> <span class="n">ref</span> <span class="p">=</span> <span class="n">getServiceReference</span><span class="p">(</span><span class="n">HelloService</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">());</span>
<span class="n">assertNotNull</span><span class="p">(</span>&quot;<span class="n">Assert</span> <span class="n">Availability</span>&quot;<span class="p">,</span> <span class="n">ref</span><span class="p">);</span>
<span class="n">HelloService</span> <span class="n">hs</span> <span class="p">=</span> <span class="p">(</span><span class="n">HelloService</span><span class="p">)</span> <span class="n">getContext</span><span class="p">().</span><span class="n">getService</span><span class="p">(</span><span class="n">ref</span><span class="p">);</span>
<span class="n">String</span> <span class="n">message</span> <span class="p">=</span> <span class="n">hs</span><span class="p">.</span><span class="n">getHelloMessage</span><span class="p">();</span>
<span class="n">assertNotNull</span><span class="p">(</span>&quot;<span class="n">Check</span> <span class="n">the</span> <span class="n">message</span> <span class="n">existence</span>&quot;<span class="p">,</span> <span class="n">message</span><span class="p">);</span>
<span class="n">assertEquals</span><span class="p">(</span>&quot;<span class="n">Check</span> <span class="n">the</span> <span class="n">message</span>&quot;<span class="p">,</span> &quot;<span class="n">hello</span>&quot;<span class="p">,</span> <span class="n">message</span><span class="p">);</span>
<span class="o">//</span> <span class="n">Don</span><span class="o">&#39;</span><span class="n">t</span> <span class="n">need</span> <span class="n">to</span> <span class="n">unget</span> <span class="n">references</span><span class="p">,</span> <span class="n">they</span> <span class="n">are</span> <span class="n">unget</span> <span class="n">by</span> <span class="n">junit4osgi</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">testHelloMessage2</span><span class="p">()</span> <span class="p">{</span>
<span class="n">assertTrue</span><span class="p">(</span>&quot;<span class="n">Check</span> <span class="n">availability</span> <span class="n">of</span> <span class="n">the</span> <span class="n">service</span>&quot;<span class="p">,</span>
<span class="n">isServiceAvailable</span><span class="p">(</span><span class="n">HelloService</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">()));</span>
<span class="n">HelloService</span> <span class="n">hs</span> <span class="p">=</span> <span class="p">(</span><span class="n">HelloService</span><span class="p">)</span> <span class="n">getServiceObject</span><span class="p">(</span><span class="n">HelloService</span><span class="p">.</span><span class="n">class</span><span class="p">.</span><span class="n">getName</span><span class="p">(),</span> <span class="n">null</span><span class="p">);</span>
<span class="n">String</span> <span class="n">message</span> <span class="p">=</span> <span class="n">hs</span><span class="p">.</span><span class="n">getHelloMessage</span><span class="p">();</span>
<span class="n">assertNotNull</span><span class="p">(</span>&quot;<span class="n">Check</span> <span class="n">the</span> <span class="n">message</span> <span class="n">existence</span>&quot;<span class="p">,</span> <span class="n">message</span><span class="p">);</span>
<span class="n">assertEquals</span><span class="p">(</span>&quot;<span class="n">Check</span> <span class="n">the</span> <span class="n">message</span>&quot;<span class="p">,</span> &quot;<span class="n">hello</span>&quot;<span class="p">,</span> <span class="n">message</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>The performed tests give out the following results :</p>
<div class="codehilite"><pre><span class="o">-&gt;</span> <span class="n">ps</span>
<span class="n">START</span> <span class="n">LEVEL</span> 1
<span class="n">ID</span> <span class="n">State</span> <span class="n">Level</span> <span class="n">Name</span>
<span class="p">...</span>
<span class="p">[</span> 17<span class="p">]</span> <span class="p">[</span><span class="n">Active</span> <span class="p">]</span> <span class="p">[</span> 1<span class="p">]</span> <span class="n">Junit</span><span class="o">-</span><span class="n">OSGi</span><span class="o">-</span><span class="n">Example</span> <span class="p">(</span>0<span class="p">)</span>
<span class="p">...</span>
<span class="o">-&gt;</span> <span class="n">services</span> 17
<span class="n">Junit</span><span class="o">-</span><span class="n">OSGi</span><span class="o">-</span><span class="n">Example</span> <span class="p">(</span>17<span class="p">)</span> <span class="n">provides</span><span class="p">:</span>
<span class="o">---------------------------------</span>
<span class="n">objectClass</span> <span class="p">=</span> <span class="n">junit</span><span class="p">.</span><span class="n">service</span><span class="p">.</span><span class="n">hello</span><span class="p">.</span><span class="n">HelloService</span>
<span class="n">service</span><span class="p">.</span><span class="n">id</span> <span class="p">=</span> 36
<span class="o">-&gt;</span> <span class="n">junit</span> 17
<span class="n">Executing</span> <span class="p">[</span><span class="n">Hello</span> <span class="n">Service</span> <span class="n">Test</span> <span class="n">Suite</span><span class="p">]</span>
<span class="p">..</span>
<span class="n">Time</span><span class="p">:</span> 0<span class="p">,</span>015
<span class="n">OK</span> <span class="p">(</span>4 <span class="n">tests</span><span class="p">)</span>
<span class="o">-&gt;</span>
</pre></div>
<h2 id="simple-right">Simple right?<a class="headerlink" href="#simple-right" title="Permanent link">&para;</a></h2>
<p>So now you know everything required to run test inside OSGi. You can start developing your own test. To help you a little bit, junit4osgi provides <a href="/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-junit4osgi/apache-felix-ipojo-junit4osgi-methods.html">utilities methods</a> greatly reducing the amount of code to write in your tests. Moreover, if you're a Maven user, the [maven-junit4osgi-plugin|apache-felix-ipojo-junit4osgi-maven] is made for you. It just runs your test directly during the maven build process.</p>
</div>
</div>
<hr/>
<div class="container">
<footer id="footer">
<div class="row">
<div class="trademarkFooter span7">
Apache Felix, Felix, Apache, the Apache feather logo, and the Apache Felix project
logo are trademarks of The Apache Software Foundation. All other marks mentioned
may be trademarks or registered trademarks of their respective owners.
</div>
<div class="timestamp span3 offset2">
Rev. 1700393 by cziegeler on Tue, 1 Sep 2015 06:04:06 +0000
</div>
</div>
</footer>
</div>
</body>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try{
var pageTracker = _gat._getTracker("UA-1518442-4");
pageTracker._trackPageview();
} catch(err) {}
</script>
</html>