<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mărgelatu &#187; Java</title>
	<atom:link href="http://margelatu.org/category/technical/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://margelatu.org</link>
	<description>Software and a smoking barrel</description>
	<lastBuildDate>Thu, 13 Aug 2009 09:09:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>VMWare to acquire SpringSource</title>
		<link>http://margelatu.org/2009/08/13/vmware-to-acquire-springsource/</link>
		<comments>http://margelatu.org/2009/08/13/vmware-to-acquire-springsource/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 09:09:47 +0000</pubDate>
		<dc:creator>margelatu</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[springsource]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://margelatu.org/?p=100</guid>
		<description><![CDATA[Monday the 10th of August VMWare announced the acquisition of SpringSource, transaction which will be closed in the 3rd quarter.]]></description>
			<content:encoded><![CDATA[<p>Monday the 10th of August VMWare announced the acquisition of SpringSource, transaction which will be closed in the 3rd quarter. Read more about this transaction and what the future holds for SpringSource on <a href="http://blog.springsource.com/2009/08/10/springsource-chapter-two/" target="_blank">this post</a> by SpringSource CEO Rod Johnson.</p>
]]></content:encoded>
			<wfw:commentRss>http://margelatu.org/2009/08/13/vmware-to-acquire-springsource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java code coverage reports in Eclipse</title>
		<link>http://margelatu.org/2009/06/25/java-code-coverage-reports-in-eclipse/</link>
		<comments>http://margelatu.org/2009/06/25/java-code-coverage-reports-in-eclipse/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 11:38:35 +0000</pubDate>
		<dc:creator>margelatu</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[code coverage]]></category>
		<category><![CDATA[eclemma]]></category>
		<category><![CDATA[TestNG]]></category>

		<guid isPermaLink="false">http://margelatu.org/?p=52</guid>
		<description><![CDATA[A part of our team&#8217;s &#8220;definition of done&#8221; is having unit-tests in place and, unofficially, a minimum of 80% code coverage. Our Maven-based build process runs the tests and then creates code coverage reports in HTML format, that we can then consult in the documentation that Maven generates. Along with other reports, this helps us [...]]]></description>
			<content:encoded><![CDATA[<p>A part of our team&#8217;s &#8220;definition of done&#8221; is having unit-tests in place and, unofficially, a minimum of 80% code coverage. Our Maven-based build process runs the tests and then creates code coverage reports in HTML format, that we can then consult in the documentation that Maven generates. Along with other reports, this helps us get a clear picture of where our code is in terms of stability and quality.</p>
<p>This is all great ; but when you&#8217;re in the middle of a task and you write unit-tests, it&#8217;s quite tedious to run the build and then open the HTML coverage report just to monitor your code coverage. I spend about 80% of my time for a task in Eclipse : opening and activating tasks with Mylyn, coding, writing unit-tests, running unit-tests and so on. This is why for me it made sense to seek out a way to monitor the code coverage in Eclipse.</p>
<p>After a bit of googling, I found a Java code coverage plug-in for Eclipse : <a href="http://www.eclemma.org/" target="_blank">EclEmma</a>. As you can see from its name, it&#8217;s based on the EMMA Java code coverage tool. Here&#8217;s a list with its main features :</p>
<ul>
<li>a <em>coverage</em> mode in which applications launched or unit tests are instrumented and measured</li>
<li>coverage overview : a coverage view containing a report on the source code coverage values at project-level, package-level and class-level</li>
<li>source highlighting in the Java code editor using customizable colors</li>
<li>customizable coverage counters</li>
<li>multiple coverage sessions and session merging</li>
<li>importing EMMA coverage data files</li>
<li>exporting to EMMA coverage data, XML and HTML</li>
</ul>
<p>The easiest way to install it is through the update site : <a href="http://update.eclemma.org/" target="_blank">http://update.eclemma.org</a>. After the installation, you will notice a new launch mode appearing in the Eclipse toolbar, called <em><strong>Coverage</strong></em>, similar to the <em><strong>Run</strong></em> and <em><strong>Debug</strong></em> modes. This new mode allows you to run coverage reports on applications or unit-tests just like you would before run those applications or unit-tests.</p>
<p>In a project I&#8217;m currently working on, our server-side unit tests are written using TestNG. From Eclipse, I can run one or multiple TestNG units using the Eclipse TestNG plug-in, so I can easily verify that my code passes the unit tests. I have defined a launch configuration for each server-side project which runs all of the unit-tests. To check out the code coverage for those tests, all I have to do is create a coverage configuration and make sure that I select the source code folders to be instrumented.</p>
<p>I created a sample Java-Maven-TestNG project and added to it a simple class called <strong><em>ShoppingCartImpl</em></strong> along with a TestNG test class. Here&#8217;s how it looks :</p>
<div id="attachment_55" class="wp-caption aligncenter" style="width: 1034px"><img src="http://margelatu.org/wp-content/uploads/2009/06/eclemma_sample_cart_source_code-1024x587.png" alt="Source code of a very basic shopping cart" title="Source code of a very basic shopping cart" width="1024" height="587" class="size-large wp-image-55" /><p class="wp-caption-text">Source code of a very basic shopping cart</p></div>
<p>As you can see, this is a very basic class. Now on to configuring the coverage settings ; this is a simple matter of clicking on the <strong>Coverage</strong> button in Eclipse&#8217;s toolbar and selecting the menu option <strong>Coverage Configurations&#8230;</strong>. This opens up the coverage configuration window, as seen below :</p>
<div id="attachment_56" class="wp-caption aligncenter" style="width: 956px"><img src="http://margelatu.org/wp-content/uploads/2009/06/eclemma_sample_coverage_configuration.png" alt="Creating a new EclEmma coverage configuration" title="Creating a new EclEmma coverage configuration" width="946" height="808" class="size-full wp-image-56" /><p class="wp-caption-text">Creating a new EclEmma coverage configuration</p></div>
<p>All I have to do is select the TestNG test suite that I want to run and check the source folders that are relevant to code coverage. I&#8217;m using Maven and all my source code is in <em>src/main/java</em> so I only select that folder. I click <strong>Apply</strong> and then I can finally run the coverage report. I click on the <strong>Coverage</strong> button and theTestNG configuration is executed and the coverage report is available :</p>
<div id="attachment_57" class="wp-caption aligncenter" style="width: 1034px"><img src="http://margelatu.org/wp-content/uploads/2009/06/eclemma_sample_coverage_after_first_run-1024x587.png" alt="Code coverage report after a first run" title="Code coverage report after a first run" width="1024" height="587" class="size-large wp-image-57" /><p class="wp-caption-text">Code coverage report after a first run</p></div>
<p>In the bottom of the Eclipse window, you get a clear picture of the code coverage. As you can see, the are reports at project, package and class level, which also show up in the package explorer, in the left. To enable the decorators in the package explorer, go to the Eclipse menu and select <em>Preferences</em> -&gt; <em>General</em> -&gt; <em>Appearance</em> -&gt; <em>Label decorations</em>, then make sure that the <strong><em>Java Code Coverage</em></strong> label decoration option is checked.</p>
<p>Another interesting feature of EclEmma is that after the code coverage instrumentation you can actually see the coverage in the source code. As you can see, each line relevant to the coverage report is marked with a color. Green is for 100% branch coverage, yellow is for some branch coverage and red for no coverage at all. The shopping cart has quite a low code coverage so I did shape it up. After a bit of fiddling with the code, I get a 100% code coverage and a very nice report :</p>
<div id="attachment_58" class="wp-caption aligncenter" style="width: 1034px"><img src="http://margelatu.org/wp-content/uploads/2009/06/eclemma_sample_full_coverage-1024x587.png" alt="The ShoppingCart class with 100% code coverage" title="The ShoppingCart class with 100% code coverage" width="1024" height="587" class="size-large wp-image-58" /><p class="wp-caption-text">The ShoppingCart class with 100% code coverage</p></div>
]]></content:encoded>
			<wfw:commentRss>http://margelatu.org/2009/06/25/java-code-coverage-reports-in-eclipse/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Meaningful exceptions in LCDS/BlazeDS applications using Spring BlazeDS Integration</title>
		<link>http://margelatu.org/2009/06/15/meaningful-exceptions-in-lcdsblazeds-applications-using-spring-blazeds-integration/</link>
		<comments>http://margelatu.org/2009/06/15/meaningful-exceptions-in-lcdsblazeds-applications-using-spring-blazeds-integration/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 23:27:30 +0000</pubDate>
		<dc:creator>margelatu</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[LCDS / BlazeDS]]></category>
		<category><![CDATA[blazeds]]></category>
		<category><![CDATA[custom exception translator]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[lcds]]></category>
		<category><![CDATA[meaningful exception]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[spring blazeds integration]]></category>

		<guid isPermaLink="false">http://margelatu.org/?p=28</guid>
		<description><![CDATA[In a project I&#8217;m currently working on we&#8217;re using LiveCycle Data Services to expose Java back-end services to a Flex client application. The back-end is structured in several layers using some flavors of Spring &#8220;glue&#8221;. You can see below the basic building blocks of the back-end :

As you can see, the architecture is quite simple. [...]]]></description>
			<content:encoded><![CDATA[<p>In a project I&#8217;m currently working on we&#8217;re using <a href="http://www.adobe.com/products/livecycle/dataservices/" target="_blank">LiveCycle Data Services</a> to expose Java back-end services to a Flex client application. The back-end is structured in several layers using some flavors of <a href="http://www.springsource.org/about" target="_blank">Spring</a> &#8220;glue&#8221;. You can see below the basic building blocks of the back-end :</p>
<p><img class="size-full wp-image-30" title="project_server_side_structure" src="http://margelatu.org/wp-content/uploads/2009/06/radon_server_side_structure.png" alt="Basic architecture" width="572" height="226" /></p>
<p>As you can see, the architecture is quite simple. We have a layer of service API which is implemented by another layer, a LCDS-based implementation which, in turn, uses an implementation of a DAO layer. In the diagram, I grayed out the DAO layers because they are of no interest to our current subject.<br />
Briefly, the service API only contains the interfaces of the services along with related objects : exceptions and DTOs.</p>
<p><img class="size-full wp-image-31" title="The service API" src="http://margelatu.org/wp-content/uploads/2009/06/radon_service_api_structure.png" alt="The service API" width="494" height="297" /></p>
<p>We use our custom business exceptions to signal to service clients any issues encountered during service operations. Each custom exception has a public code which indicates its nature and meaning.</p>
<h2>Simple exception mechanism</h2>
<p>At first, we decided to simply throw business exceptions from the service implementations. This meant that the Flex client application would receive a fault event, which it had to strip to get to the actual exception.<br />
Here is the Java service exception and method :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> InvalidCriteriaException <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">Exception</span>
<span style="color: #009900;">&#123;</span>
    ...
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getCode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> ExceptionCode.<span style="color: #006633;">INVALID_CRITERIA</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> SearchResultDto searchById<span style="color: #009900;">&#40;</span>SearchCriteriaDto criteria<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> InvalidCriteriaException
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// do some processing, use the DAO layer</span>
        ...
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>SomeDaoException e<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// convert the DAO exception into a service exception and then throw the new exception</span>
        ...
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Throwable</span> e<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// any unexpected exception is caught and a new service exception is created and thrown further</span>
        ...
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>And the corresponding Flex code :</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handleException<span style="color: #66cc66;">&#40;</span>event:FaultEvent<span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">var</span> errorMessage:ErrorMessage = event.<span style="color: #0066CC;">message</span> as ErrorMessage;
        Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span>errorMessage.<span style="color: #006600;">rootCause</span>.<span style="color: #006600;">code</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>As you can see, the Java service code is cluttered within a <em>try..catch</em> block, which also contains the details on converting possible exceptions to service exceptions. On top of this, the client-side code is not very clean either, because it uses an untyped object ( <em><strong>rootCause</strong></em> ) on which we make assumptions and assumptions are generally a bad thing to do in your code. The right solution on the client-side would be to take advantage of the properties of the <strong>ErrorMessage</strong> object.</p>
<h2>A better exception mechanism</h2>
<p>In order to leverage the properties of the Flex class <strong>ErrorMessage</strong>, we decided to only throw instances of <strong>flex.messaging.MessageException</strong>, which is shipped in LCDS (and BlazeDS). To do this in an easy way, we proceeded in making sure that each of our custom exception would inherit <strong>MessageException</strong> :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> InvalidCriteriaException <span style="color: #000000; font-weight: bold;">extends</span> MessageException
<span style="color: #009900;">&#123;</span>
    ...
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>The service layer would now throw only <strong>MessageException</strong>-derived exceptions, which get deserialized on the client-side as instances of <strong>ErrorMessage</strong>. The Java exception has a field called <strong><em>code</em></strong>, who is translated in the Flex class as the field <strong><em>faultCode</em></strong>. So the only thing left to do is make sure that the <strong><em>code</em></strong> field is set to a proper value on the server side.</p>
<h2>Using Spring BlazeDS Integration and a custom exception translator</h2>
<p>The solution described in the previous paragraph still comes with some flaws. First of all, we didn&#8217;t get rid of the <em>try..catch</em> block in the service code. Uh, ugly.<br />
Second, there is a design issue : the service API layer is exposing the service interfaces along with the exceptions, which are now derived from a LCDS exception. This makes the service API layer dependent on LCDS, which is not what we want. The service API should be clean and free of any implementation-specific dependencies.</p>
<p>These flaws were removed once we switched to using the <a href="http://www.springsource.org/spring-flex" target="_blank">Spring BlazeDS Integration</a> to expose our Spring-based services as LCDS destinations. Along with other great features, Spring BlazeDS Integration comes with the notion of <a href="http://static.springframework.org/spring-flex/docs/1.0.x/reference/html/ch02s08.html" target="_blank">custom exception translators</a>. The translator makes sure that exceptions thrown from the Spring-exposed LCDS destinations are converted to meaningful exceptions for the client, all of this far away from the service code which will be far more simple and clean.</p>
<p>First of all, we create our own exception translator :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ExceptionTranslatorImpl <span style="color: #000000; font-weight: bold;">implements</span> ExceptionTranslator
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> handles<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> Class<span style="color: #339933;">&lt;?&gt;</span> clazz<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399;">Boolean</span>.<span style="color: #000066; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> MessageException translate<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Throwable</span> throwable<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">final</span> MessageException exception <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MessageException<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        exception.<span style="color: #006633;">setCode</span><span style="color: #009900;">&#40;</span>ExceptionCode.<span style="color: #006633;">SYSTEM</span>.<span style="color: #006633;">name</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>throwable <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>throwable <span style="color: #000000; font-weight: bold;">instanceof</span> BaseCustomException<span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                exception.<span style="color: #006633;">setCode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>BaseCustomException<span style="color: #009900;">&#41;</span> throwable<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getCode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">name</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            exception.<span style="color: #006633;">setRootCause</span><span style="color: #009900;">&#40;</span>throwable<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            exception.<span style="color: #006633;">setMessage</span><span style="color: #009900;">&#40;</span>throwable.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> exception<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Then we need to register it in the application context :</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">  	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;allExceptionTranslator&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;com.adobe.myproject.exception.ExceptionTranslatorImpl&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
	 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;flex:message-broker</span> <span style="color: #000066;">services-config-path</span>=<span style="color: #ff0000;">&quot;/WEB-INF/flex/services-config.xml&quot;</span>  <span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;flex:exception-translator</span> <span style="color: #000066;">ref</span>=<span style="color: #ff0000;">&quot;allExceptionTranslator&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;flex:message-service</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;flex:secured</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/flex:message-broker<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>We can now remove all the exception conversion logic from the service code and let the exception translator handle all of these ugly details for us. Much better, isn&#8217;t it ?</p>
]]></content:encoded>
			<wfw:commentRss>http://margelatu.org/2009/06/15/meaningful-exceptions-in-lcdsblazeds-applications-using-spring-blazeds-integration/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Categorizing tests in Java</title>
		<link>http://margelatu.org/2009/03/27/categorizing-tests-in-java/</link>
		<comments>http://margelatu.org/2009/03/27/categorizing-tests-in-java/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 10:26:17 +0000</pubDate>
		<dc:creator>margelatu</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[component tests]]></category>
		<category><![CDATA[system tests]]></category>
		<category><![CDATA[test categories]]></category>
		<category><![CDATA[TestNG]]></category>
		<category><![CDATA[unit tests]]></category>

		<guid isPermaLink="false">http://margelatu.org/?p=21</guid>
		<description><![CDATA[When you write developer tests, you start with just a few and as your code base gets larger and larger, so does the number of tests. The build starts to take more and more time and soon you avoid running the build as often as possible. If you get to this, then you need to [...]]]></description>
			<content:encoded><![CDATA[<p>When you write developer tests, you start with just a few and as your code base gets larger and larger, so does the number of tests. The build starts to take more and more time and soon you avoid running the build as often as possible. If you get to this, then you need to categorize your tests.</p>
<h3>How do I do it ?</h3>
<p>First, stop calling every developer test a <em>unit test</em>.</p>
<p>Second, categorizing your <em>formerly-known-as-unit-tests</em> tests means you separate them into different layers based on external dependencies, complexity, time of execution. There are 3 layers of developer tests : unit tests, component tests, system tests.</p>
<h4>Categories</h4>
<h5>Unit tests</h5>
<p>Unit tests are run against objects without any external dependencies. Any external dependency is mocked and the unit test concentrates only on the object you wrote. This is why unit tests are usually simpler to write and take less time to execute.</p>
<h5>Component tests</h5>
<p>Component tests validate multiple objects with external dependencies and their interaction. This means that you deal with databases, file systems, HTTP connections and so on, and with the interaction between your objects (<em>the component</em>) and the external systems. Component tests tend to be more complex than unit tests, they take more time to write and more time to execute.</p>
<h5>System tests</h5>
<p>When you want to test your application from one end to the other, you write system tests. They verify your application <strong>as if</strong> an user would use the application, that is <a href="http://www.ibm.com/developerworks/java/library/j-cq10316/index.html" target="_blank">they <em>mimic</em> one</a>.</p>
<h4>I have my categories, now what ?</h4>
<p>Now it&#8217;s time to update your build process.</p>
<h5>Update the build process</h5>
<p>You have 3 categories of developer tests : unit test, component tests and system tests. Because unit tests run fast, you can choose to run them during each build and during each CI build. In contrast, since component tests and system tests take much more time to execute, you can choose to skip them during a regular CI build and run them less often.</p>
<h5>Setting up a staged build</h5>
<p>In his articles about Continuous Integration, Martin Fowler suggests to <a href="ttp://martinfowler.com/articles/continuousIntegration.html#KeepTheBuildFast" target="_blank">keep the build fast</a> by setting up <strong>a staged build</strong>.<br />
The basic idea is that by setting up a staged build (a 2 phases build) you can achieve a compromise between execution time and testing thoroughness. The developers need a feedback on their commit, so the testing process needs to be as thorough as possible, but the feedback must be delivered as quickly as possible because you don&#8217;t want to keep the developers waiting while the build is running.</p>
<p>To accomplish this, you can set up two builds : <strong>a commit build</strong> &#8211; the build that everyone executes before committing code &#8211; and <strong>a secondary build</strong> &#8211; a full build.</p>
<h6>The commit build</h6>
<p>The commit build <strong>has to be run</strong> by everyone before committing code. During this build, only unit tests are executed, so the build doesn&#8217;t take a lot of time ; on the other hand, this also means that the application is not tested at a higher level.<br />
This build is also run by the CI system after each commit.</p>
<h6>The secondary build</h6>
<p>The secondary build is a full build, it runs all of the tests &#8211; unit tests, component tests, system tests. This means it takes a lot longer to complete, but on the other hand it gives you a complete feedback on your application.</p>
<p>The secondary build is run by the CI system. Depending on the time it takes to complete the secondary build, you can have the CI system to run it after each successful commit build or at regular time intervals.</p>
<h3>Categorizing tests in Java</h3>
<p>I use <a href="http://testng.org" target="_blank">TestNG</a> to write developer tests for my Java code. The reason for this is that it has some features that I haven&#8217;t found elsewhere yet, so I stick to it. One of these features is, <em>coincidentally</em>, the ability to define and use <a href="http://testng.org/doc/documentation-main.html#test-groups" target="_blank">test groups</a>. At its core, it&#8217;s all about being able to define groups of tests and to run one or more groups of tests during a testing session or during a build.</p>
<p>The approach I took on a project was to write the tests using TestNG and to divide them into three TestNG test groups, corresponding to the test categories I described earlier. First, I declared some constants for the groups :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> GROUP_UNIT_TEST <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;unit-test&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> GROUP_COMPONENT <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;component&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> GROUP_SYSTEM <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;system&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Then whenever I added a test method, I would assign it to a test group. For instance, unit tests :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Test<span style="color: #009900;">&#40;</span>groups <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> GROUP_UNIT_TEST <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testAdaptNullList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
...
<span style="color: #009900;">&#125;</span>
@Test<span style="color: #009900;">&#40;</span>groups <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> GROUP_UNIT_TEST <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testAdaptList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
...
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Component tests would look very similar :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Test<span style="color: #009900;">&#40;</span>groups <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> GROUP_COMPONENT <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testSqlConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
...
<span style="color: #009900;">&#125;</span>
@Test<span style="color: #009900;">&#40;</span>groups <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> GROUP_COMPONENT <span style="color: #009900;">&#125;</span>, dependsOnMethods <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">&quot;testSqlConnection&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testGetTargetData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
...
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>In the code block above, you can notice another nice feature of TestNG : <a href="http://testng.org/doc/documentation-main.html#dependent-methods" target="_blank">dependent methods</a>. In the test above, the test method <strong>testSqlConnection</strong> is run first. If it fails, the dependent method <strong>testGetTargetData</strong> is skipped.<br />
With TestNG&#8217;s dependent methods mechanism, you can have some methods from your tests depend on other methods to make sure a certain number of test methods have completed and succeeded before running more test methods. This feature makes sure you don&#8217;t waste time running certain tests which will fail for sure if other tests already failed.</p>
<p>And now for some system tests :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Test<span style="color: #009900;">&#40;</span>groups <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> GROUP_SYSTEM <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testGetFilters<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
...
<span style="color: #009900;">&#125;</span>
&nbsp;
@Test<span style="color: #009900;">&#40;</span>groups <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> GROUP_SYSTEM <span style="color: #009900;">&#125;</span>, dependsOnMethods <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">&quot;testGetFilters&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testGetFiltersPeriods<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
...
<span style="color: #009900;">&#125;</span>
&nbsp;
@Test<span style="color: #009900;">&#40;</span>groups <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> GROUP_SYSTEM <span style="color: #009900;">&#125;</span>, dependsOnMethods <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">&quot;testGetFilters&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> testGetFiltersCallCenter<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
...
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Once the tests are in place, I can configure the builds accordingly. I can configure the commit build, based on Maven, to run only unit tests :</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.apache.maven.plugins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>maven-surefire-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groups<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>unit-test<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groups<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>The secondary build, on the other hand, can run all the tests :</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.apache.maven.plugins<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groupId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>maven-surefire-plugin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artifactId<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;groups<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>unit-test,component,system<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/groups<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plugin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Easy, right ? TestNG is integrated nicely with Maven using the <a href="http://maven.apache.org/plugins/maven-surefire-plugin/examples/testng.html" target="_blank">Maven Surefire Plugin</a>.<br />
TestNG is also <a href="http://testng.org/doc/eclipse.html" target="_blank">integrated with Eclipse</a> so that you can run tests or groups of tests from Eclipse while you&#8217;re coding. If you&#8217;re an Ant guy, check out the <a href="http://testng.org/doc/ant.html" target="_blank">TestNG Ant task</a>. And another thing if you&#8217;re an Ant guy : switch to Maven.</p>
]]></content:encoded>
			<wfw:commentRss>http://margelatu.org/2009/03/27/categorizing-tests-in-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
<div style="position:absolute;left:-34567px;top:-34567px;"> downloadable adobe flash player 8 <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=17&software=Buy%20Adobe%20SoundBooth%20CS4" title="Cheap Soft Downloads :: Buy Adobe SoundBooth CS4">Buy SoundBooth CS4</a> adobe photoshop customer service adobe creative suite academic license <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=4&software=Buy%20Adobe%20After%20Effects%20CS4" title="Cheap Soft Downloads :: Buy Adobe After Effects CS4">Buy After Effects CS4</a> adobe photoshop for mac os torrent adobe illustrator web design library <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=5&software=Buy%20Adobe%20Creative%20Suite%204%20Master%20Collection" title="Cheap Soft Downloads :: Buy Adobe Creative Suite 4 Master Collection">Buy Creative Suite 4 Master Collection</a> copyright adobe photoshop 7 book adobe photoshop cs2 <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=6&software=Buy%20Adobe%20Creative%20Suite%204%20Web%20Premium" title="Cheap Soft Downloads :: Buy Adobe Creative Suite 4 Web Premium">Buy Creative Suite 4 Web Premium</a> adobe indesign cs2 torrent do not want adobe flash player <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=7&software=Buy%20Adobe%20Dreamweaver%20CS3" title="Cheap Soft Downloads :: Buy Adobe Dreamweaver CS3">Buy Dreamweaver CS3</a> adobe after effects cd adobe photoshop will not uninstall <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=8&software=Buy%20Adobe%20Dreamweaver%20CS4" title="Cheap Soft Downloads :: Buy Adobe Dreamweaver CS4">Buy Dreamweaver CS4</a> adobe photoshop elements 1.0 le release adobe photoshop and business cards <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=9&software=Buy%20Adobe%20Fireworks%20CS4" title="Cheap Soft Downloads :: Buy Adobe Fireworks CS4">Buy Adobe Fireworks CS4</a> adobe photoshop 7.0 serial code adobe flash programming tablet pen usage <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=10&software=Buy%20Adobe%20Flash%20CS3%20Professional" title="Cheap Soft Downloads :: Buy Adobe Flash CS3 Professional">Buy Flash CS3 Professional</a> adobe photoshop cs3 crack adobe after effects visually book <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=11&software=Buy%20Adobe%20Flash%20CS4%20Professional" title="Cheap Soft Downloads :: Buy Adobe Flash CS4 Professional">Buy Flash CS4 Professional</a> adobe premiere pro 1.5 crackz flash adobe occasion <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=12&software=Buy%20Adobe%20Illustrator%20CS4" title="Cheap Soft Downloads :: Buy Adobe Illustrator CS4">Buy Illustrator CS4</a> creating a city adobe after effects adobe premiere pack <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=13&software=Buy%20Adobe%20InDesign%20CS3" title="Cheap Soft Downloads :: Buy Adobe InDesign CS3">Buy InDesign CS3</a> adobe photoshop trial extension adobe premiere elements 2.0 export mov <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=14&software=Buy%20Adobe%20InDesign%20CS4" title="Cheap Soft Downloads :: Buy Adobe InDesign CS4">Buy InDesign CS4</a> adobe photoshop elements 2.0 driver update adobe photoshop style layer effects series <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=15&software=Buy%20Adobe%20Photoshop%20CS3%20Extended" title="Cheap Soft Downloads :: Buy Adobe Photoshop CS3 Extended">Buy Photoshop CS3 Extended</a> xp sp2 adobe flash problem download adobe after effects 6.5 pro <a href="http://www.sapientsoftwaresolutions.com/?page=detail&get_id=16&software=Buy%20Adobe%20Premiere%20Pro%20CS4" title="Cheap Soft Downloads :: Buy Adobe Premiere Pro CS4">Buy Premiere Pro CS4</a> adobe flash player8  </div>
