<?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>Everything is wrong &#187; Tests unitaires</title>
	<atom:link href="http://everythingiswrong.free.fr/index.php/category/java-j2ee/tests-unitaires/feed/" rel="self" type="application/rss+xml" />
	<link>http://everythingiswrong.free.fr</link>
	<description>Un blog dédié à l&#039;informatique en général</description>
	<lastBuildDate>Wed, 06 Oct 2021 21:20:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Arquillian &#8211; Graphene et RichFaces</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/07/29/arquillian-graphene-et-richfaces/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/07/29/arquillian-graphene-et-richfaces/#comments</comments>
		<pubDate>Tue, 29 Jul 2014 18:28:38 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[Tests unitaires]]></category>
		<category><![CDATA[Arquillian]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=3216</guid>
		<description><![CDATA[Profitez des pages fragments de RichFaces pour développer ses propres tests unitaires...]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Richfaces 4.5.0.Alpha3 est sortie ! Avec cette version, une nouveauté, les fragments de page (pages-fragments). Il s&#8217;agit de classes qui permettent de développer des tests unitaires automatisés sur les applications utilisant RichFaces.</p>
<p style="text-align: justify;">La configuration Maven pour utiliser ces fragements est la suivante :</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;dependency&gt;
    &lt;groupId&gt;org.richfaces&lt;/groupId&gt;
    &lt;artifactId&gt;richfaces-page-fragments&lt;/artifactId&gt;
    &lt;version&gt;4.5.0.Alpha3&lt;/version&gt;
    &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;</pre>
<p style="text-align: justify;">Les sources sont disponibles sur GitHub : <a href="https://github.com/richfaces/richfaces/tree/master/build/page-fragments" target="_blank">https://github.com/richfaces/richfaces/tree/master/build/page-fragments</a>.</p>
<p style="text-align: justify;">Pour plus d&#8217;informations sur Arquillian : <a href="http://slides.com/vineetreynolds/the-arquillian-universe" target="_blank">http://slides.com/vineetreynolds/the-arquillian-universe</a>.</p>
<p style="text-align: justify;">Pour plus d&#8217;informations sur les tests d&#8217;application JSF : <a href="http://www.bleathem.ca/talks/2012-JavaOne/testing-jsf.html" target="_blank">http://www.bleathem.ca/talks/2012-JavaOne/testing-jsf.html</a>.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/07/29/arquillian-graphene-et-richfaces/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JBoss &#8211; Tracer les requêtes HTTP</title>
		<link>http://everythingiswrong.free.fr/index.php/2014/07/22/jboss-tracer-les-requetes-http/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2014/07/22/jboss-tracer-les-requetes-http/#comments</comments>
		<pubDate>Tue, 22 Jul 2014 19:09:15 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[Tests unitaires]]></category>
		<category><![CDATA[Arquillian]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=3200</guid>
		<description><![CDATA[Tracer le contenu des requêtes HTTP d'une application Java J2EE.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En travaillant sur un test <a href="https://docs.jboss.org/author/display/ARQGRA2/Home" target="_blank">Graphene 2</a>, je me suis rendu compte qu&#8217;il pouvait être très intéressant de tracer le contenu des requêtes HTTP attaquant une application web. Lorsque cette application est déployée sur un serveur JBoss, il suffit d&#8217;ajouter une ligne dans le fichier <code>jboss-web.xml</code> :</p>
<pre class="brush: xml; gutter: true; first-line: 1">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;jboss-web&gt;
   &lt;valve&gt;
      &lt;class-name&gt;org.apache.catalina.valves.RequestDumperValve&lt;/class-name&gt;
   &lt;/valve&gt;
&lt;/jboss-web&gt;</pre>
<p style="text-align: justify;">Remarque, je n&#8217;ai pas essayé sur WildFly, mais la technique devrait fonctionner de la même façon. Ce fichier doit être dans le répertoire <code>WEB-INF</code> de l&#8217;archive web.</p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2014/07/22/jboss-tracer-les-requetes-http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wiser : tester l&#8217;envoi d&#8217;un email</title>
		<link>http://everythingiswrong.free.fr/index.php/2011/10/21/wiser-tester-lenvoi-dun-email/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2011/10/21/wiser-tester-lenvoi-dun-email/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 22:27:46 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Tests unitaires]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false">http://everythingiswrong.free.fr/?p=1661</guid>
		<description><![CDATA[Tester unitairement l'envoi des emails (JavaMail)]]></description>
			<content:encoded><![CDATA[<p>Wiser est un petit serveur SMPT facilement intégrable dans une classe de test unitaire (Junit, TestNg, etc.). Il réceptionne les messages et les sauvegardes dans un tableau au lieu de les envoyer sur le réseau. Ces messages sont ensuite disponibles pour vérification.</p>
<p>Avec ce serveur, il est possible de vérifier tous les types de mails même ceux qui contiennent des pièces jointes. Il est développé dans le projet <a href="http://code.google.com/p/subethasmtp/" target="_blank">subethasmtp</a>.</p>
<p>Dans un projet maven il est nécessaire d&#8217;ajouter les dépendances suivantes :</p>
<pre class="brush: xml; toolbar: true;">&lt;dependency&gt;
    &lt;groupId&gt;org.subethamail&lt;/groupId&gt;
    &lt;artifactId&gt;subethasmtp-wiser&lt;/artifactId&gt;
    &lt;version&gt;1.2&lt;/version&gt;
    &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;

&lt;dependency&gt;
    &lt;groupId&gt;junit&lt;/groupId&gt;
    &lt;artifactId&gt;junit&lt;/artifactId&gt;
    &lt;version&gt;4.8.2&lt;/version&gt;
    &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;</pre>
<p>Il faut, ensuite, écrire une méthode qui va envoyer un email et la tester dans une classe JUnit. Je vous propose d&#8217;utiliser JavaMail. Remarque : vous pouvez aussi envoyer un email à partir d&#8217;un logiciel comme thunderbird s&#8217;il est configuré avec Wiser comme serveur SMTP.</p>
<pre class="brush: java; toolbar: true;"> /**
  * Méthode qui envoie un email.
  */
public void sendEmail(String serveur, int port) throws AddressException, MessagingException {
   Properties prop = System.getProperties();
   prop.put("mail.smtp.host", serveur);
   prop.put("mail.smtp.port", String.valueOf(port));

   Session session = Session.getDefaultInstance(prop,null);
   InternetAddress[] internetAddresses =
   new InternetAddress[] {new InternetAddress("toi@xxx.com")};

   Message message = new MimeMessage(session);
   message.setFrom(new InternetAddress("moi@xxx.com"));
   message.setRecipients(Message.RecipientType.TO, internetAddresses);
   message.setSubject("Test");
   message.setText("test mail");

   Transport.send(message);
 }

 /**
 * Démarrage de Wiser avant l'éxécution du test.
 */
 @Before
 public void setUp() {
   wiser = new Wiser();
   wiser.setPort(2500); // port par défaut : 25
   wiser.start();
 }

 @After
 public void tearDown() {
   wiser.stop();
 }

 @Test
 public void testSendEmail() {
   try {
     sendEmail("localhost", 2500);   // Appel de la méthode qui envoie l'email.
     assertEquals(1, wiser.getMessages().size());

     for (WiserMessage message : wiser.getMessages()) {
       String envelopeSender = message.getEnvelopeSender();
       String envelopeReceiver = message.getEnvelopeReceiver();

       MimeMessage mess = message.getMimeMessage();

       // Il ne reste plus qu'a vérifier le contenu de l'email.
     }

   } catch (Exception e) {
     fail();
   }
 }</pre>
<p>Vous pouvez retrouver mon projet exemple <a href="https://subversion.assembla.com/svn/everythingiswrong/tutorial-wiser/" target="_blank">ici</a>.</p>
<p>Dans la distribution de subethasmtp, vous retrouverez des exemples pour tester des emails plus compliqués avec notament des pièces jointes.</p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2011/10/21/wiser-tester-lenvoi-dun-email/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclispe IDE : MoreUnit</title>
		<link>http://everythingiswrong.free.fr/index.php/2011/06/29/eclispe-ide-moreunit/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2011/06/29/eclispe-ide-moreunit/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 20:41:11 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Eclipse IDE]]></category>
		<category><![CDATA[Tests unitaires]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false">http://yan.langlois.free.fr/wordpress/?p=862</guid>
		<description><![CDATA[Comment gagner du temps lors du développement de tests unitaire ?]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Il y a quelques mois, on m&#8217;a fait découvrir le plugin eclipse <a href="http://moreunit.sourceforge.net" target="_blank">MoreUnit</a>. Comme je le trouve très pratique, je profite de mon blog pour en parler. Il permet de gagner du temps pour le développement et l&#8217;exécution des tests unitaires. Il facilite aussi l&#8217;association entre les classes destinées à l&#8217;exécution et celles qui vont les tester. Ce plugin est disponible sur le marketplace.</p>
<p style="text-align: justify;">Si l&#8217;option <em>Decorate Classes with Test Case</em> est activée (<em>Window &gt; Preferences&#8230; &gt; General &gt; Appearance 			&gt; Label Decorations</em>), les classes qui sont testées sont représentées avec un icon différent :</p>
<p style="text-align: center;"><img class="aligncenter" src="http://yan.langlois.free.fr/wordpress/wp-content/uploads/classDecoration.png" alt="" width="252" height="257" /></p>
<p style="text-align: justify;">La même marque verte apparaît au niveau de la marge de l&#8217;éditeur Java au début des méthodes testées :</p>
<p style="text-align: center;"><img class="aligncenter" src="http://yan.langlois.free.fr/wordpress/wp-content/uploads/markerEditor.png" alt="" width="348" height="272" /></p>
<p style="text-align: justify;">A partir d&#8217;une classe, un menu contextuel permet les actions suivantes :</p>
<ul>
<li>Ouvrir la classe de test associée</li>
<li>Générer la classe de test si celle-ci n&#8217;existe pas</li>
<li>Exécuter la classe de test en entier</li>
<li>Exécuter les méthodes de test associées à une sélection de méthodes de la classe d&#8217;origine</li>
</ul>
<p>Le plugin sait aussi prendre en compte les refactorings de la classe testée :</p>
<ul>
<li>Si la classe testée est renommée, la classe de test est renommé elle aussi</li>
<li>Idem, si la méthode testée est renommée, les méthodes de test le sont aussi</li>
<li>Si la classe testée change de package, la classe de test change aussi de package</li>
</ul>
<p style="text-align: justify;">Enfin, la dernière fonctionnalité que je trouve très utile dans certains contextes, MoreUnit peut générer les mocks des objets utilisés dans la classe testée. Il est compatible avec Mockito et EasyMock. Il ne reste plus qu&#8217;a les paraméter.</p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2011/06/29/eclispe-ide-moreunit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tests unitaires et multithreading</title>
		<link>http://everythingiswrong.free.fr/index.php/2011/04/17/tests-unitaires-et-multithreading/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2011/04/17/tests-unitaires-et-multithreading/#comments</comments>
		<pubDate>Sun, 17 Apr 2011 21:19:39 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[Tests unitaires]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Multithreading]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false">http://yan.langlois.free.fr/wordpress/?p=1224</guid>
		<description><![CDATA[Comment vérifier qu'une méthode ou un programme Java est bien threadsafe.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Comment savoir si une méthode développée fonctionne bien dans un contexte multithread ? Pour répondre à cette question je vous propose cet exemple qui se base sur une classe simple utilisant une instance  statique de <a href="http://download.oracle.com/javase/6/docs/api/index.html?java/text/SimpleDateFormat.html" target="_blank">SimpleDateFormat</a> qui n&#8217;est pas un objet threadsafe. Cette classe possède deux méthodes l&#8217;une n&#8217;est pas threadsafe l&#8217;autre l&#8217;est grâce à un bloc &#8220;synchronisé&#8221;.</p>
<pre class="brush: java; toolbar: true;">public class DateUtil {
 /** Static pour bénéficier d'une instance partagée par l'ensemble des threads.*/
 private static DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

 public static Date parse(String date) throws ParseException {
   Date result = null;
   result = df.parse(date);
   return result;
 }

 public static Date parseThreadSafe(String date) throws ParseException {
   Date result = null;
   // Ce bloc garantit que la méthode fonctionne en multithread.
   synchronized (df) {
     result = df.parse(date);
   }
   return result;
 }
}</pre>
<p style="text-align: justify;">La classe de test utilise la librairie <a href="http://testng.org/" target="_blank">TestNg</a> et non <a href="http://www.junit.org" target="_blank">JUnit</a> car cette dernière ne propose pas de support du multithread. De son coté, TestNg permet de paramétrer une méthode de test avec, entre autre, deux paramètres :</p>
<ul>
<li>invocationCount : le nombre d&#8217;invocation de la méthode (valeur par défaut : 1)</li>
<li>threadPoolSize : la taille du pool de threads qui vont exécuter la méthode (valeur par défaut : 0)</li>
</ul>
<pre class="brush: java; toolbar: true;">public class DateUtilTest {

 @Test(threadPoolSize=20, invocationCount=100)
 public void testParse() {
   try {
     for (int i = 10; i &lt; 20; i++) {
       assertEquals(new SimpleDateFormat("dd/MM/yyyy").parse("01/01/20" + i),
         DateUtil.parse("01/01/20" + i));    
     }
   } catch (ParseException e) {
     fail("TEST KO : " + e.getMessage());
   }
 }

 @Test(threadPoolSize=20, invocationCount=100)
 public void testParseThreadSafe() {
   try {
     for (int i = 10; i &lt; 20; i++) {
       assertEquals(new SimpleDateFormat("dd/MM/yyyy").parse("01/01/20" + i),
         DateUtil.parseThreadSafe("01/01/20" + i));    
     }
   } catch (ParseException e) {
     fail("TEST KO : " + e.getMessage());
   }
 }

}</pre>
<p style="text-align: justify;">Les boucles <em>for</em> servent à augmenter la probabilité d&#8217;appel simultanés des méthodes testées. Le résultat de l&#8217;exécution est assez simple a analyser car les seules méthodes qui tombent en erreur sont celles qui exécutent la méthode sans le bloc synchronisé.</p>
<p style="text-align: justify;">Vous pouvez retrouver le projet maven à l&#8217;adresse suivante : <a href="https://subversion.assembla.com/svn/everythingiswrong/multithread-tests" target="_blank">https://subversion.assembla.com/svn/everythingiswrong/multithread-tests</a></p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2011/04/17/tests-unitaires-et-multithreading/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven et SeamTest</title>
		<link>http://everythingiswrong.free.fr/index.php/2011/03/22/maven-et-seamtest/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2011/03/22/maven-et-seamtest/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 22:10:46 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Conteneurs embarqués]]></category>
		<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Tests unitaires]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false">http://yan.langlois.free.fr/wordpress/?p=1098</guid>
		<description><![CDATA[Comment intégrer des tests d'intégration avec SeamTest ou DBUnitSeamTest dans un projet Maven.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">L&#8217;intégration des tests unitaires SeamTest dans un projet <a href="http://maven.apache.org/" target="_blank">Maven</a> est assez compliquée. Voici un exemple concret :</p>
<h1 style="text-align: justify;">Présentation du projet</h1>
<p style="text-align: justify;">Avant de rentrer dans des détails techniques, je préfère vous parler de l&#8217;application qui va me servir de base pour intégrer mon test SeamTest.</p>
<h2>Vision fonctionnelle</h2>
<p style="text-align: justify;">J&#8217;ai choisi de me baser sur l&#8217;exemple &#8220;hello world&#8221; du livre <em>Seam Framework:  Experience the Evolution of Java EE 2nd edition</em>. Vous pouvez retrouver les sources des exemples du livre à l&#8217;adresse suivante : <a href="http://solutionsfit.com/blog/books/" target="_blank">http://solutionsfit.com/blog/books/</a>. Malheureusement, l&#8217;auteur utilise <a href="http://ant.apache.org/" target="_blank">Ant</a> et non Maven pour gérer la compilation de ses projets.</p>
<p style="text-align: justify;">J&#8217;ai rajouté l&#8217;utilisation d&#8217;un service EJB Stateless pour démontrer la possibilité d&#8217;utiliser SeamTest dans un contexte technique hétérogène. Voici le diagramme des cas d&#8217;utilisation de l&#8217;application :</p>
<p style="text-align: center;"><img class="aligncenter" title="Cas d'utilisation de l'application" src="http://yuml.me/diagram/scruffy/usecase/[Utilisateur]-(Enregistrer une personne), [Utilisateur]-(Visualiser les personnes enregistrées)" alt="Cas d'utilisation de l'application" /></p>
<h2>Vision maven</h2>
<p>Le projet est composé d&#8217;un module père ayant trois modules fils :</p>
<p class="wp-caption" style="text-align: justify;">seamtest-parent<br />
|&#8211; seamtest-ear<br />
|&#8211; seamtest-ejb<br />
`&#8211; seamtest-webapp</p>
<p style="text-align: justify;">Vous pouvez checkouter les sources à l&#8217;adresse suivante : <a href="https://subversion.assembla.com/svn/everythingiswrong/seamtest-parent/" target="_blank">https://subversion.assembla.com/svn/everythingiswrong/seamtest-parent/</a>.</p>
<p style="text-align: justify;">Dans le reste de l&#8217;article, je vais me focaliser sur le module seamtest-ejb car c&#8217;est lui qui contient le composant Seam, la persistance et l&#8217;EJB Stateless à tester.</p>
<h2 style="text-align: justify;">Composant Seam à tester</h2>
<p>Nous allons tester le composant qui va :</p>
<ul>
<li>Enregistrer une nouvelle personne dans la base de données</li>
<li>Rechercher toutes les personnes de la base de données</li>
</ul>
<pre class="brush: java; toolbar: true;">@Stateful
@Name("manager")
public class ManagerAction extends Manager {
  @In
  private Person person;

  @Out
  private List&lt;Person&gt; fans;

  @EJB
  private CalculService calculService;

  @PersistenceContext
  private EntityManager em;

  //Méthode à tester.
  public void sayHello () {
    em.persist (person);
    fans = em.createQuery("select p from Person p").getResultList();
  }

  // Méthode pour vérifier l'injection de l'EJB Stateless dans le composant Seam
  public int additionner(int a, int b) {
    return (int) calculService.addition(a, b);
  }

  @Remove
  @Destroy
  public void destroy() {
  }
}</pre>
<h1 style="text-align: justify;">Installation et configuration</h1>
<p style="text-align: justify;">Pour information, SeamTest utilise le serveur <a href="http://community.jboss.org/wiki/EmbeddedJBoss" target="_blank">JBoss embedded</a>.</p>
<h2 style="text-align: justify;">Installation de JBoss Embedded</h2>
<p style="text-align: justify;">Cette installation se résume à la copie du répertoire booststrap qui est dans la distribution de Seam (par exemple <a href="http://anonsvn.jboss.org/repos/seam/branches/community/Seam_2_2/bootstrap/" target="_blank">ici</a>) dans le répertoire src/test.</p>
<h2 style="text-align: justify;">Le fichier &#8220;pom.xml&#8221;</h2>
<p style="text-align: justify;">Ce fichier doit contenir l&#8217;ensemble des librairies qui vont permettre de démarrer et d&#8217;exécuter le serveur JBoss embedded. Il doit aussi prendre en compte le répertoire de <em>bootstrap</em> ajouté précédemment dans les ressources des tests.</p>
<pre class="brush: xml; toolbar: true;">&lt;dependencies&gt;
  ...
  &lt;!-- dépendances des tests unitaites : http://community.jboss.org/thread/18299 --&gt;
  &lt;!-- dependencies related to JBoss Embedded for Seam 2.X.X --&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.jboss.seam.embedded&lt;/groupId&gt;
    &lt;artifactId&gt;jboss-embedded-all&lt;/artifactId&gt;
    &lt;version&gt;beta3.SP12&lt;/version&gt;
    &lt;scope&gt;test&lt;/scope&gt;
    &lt;exclusions&gt;
      &lt;exclusion&gt;
        &lt;groupId&gt;org.jboss.microcontainer&lt;/groupId&gt;
        &lt;artifactId&gt;jboss-deployers-client-spi&lt;/artifactId&gt;
      &lt;/exclusion&gt;
      &lt;exclusion&gt;
        &lt;groupId&gt;org.jboss.microcontainer&lt;/groupId&gt;
        &lt;artifactId&gt;jboss-deployers-core-spi&lt;/artifactId&gt;
      &lt;/exclusion&gt;
    &lt;/exclusions&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.jboss.seam.embedded&lt;/groupId&gt;
    &lt;artifactId&gt;hibernate-all&lt;/artifactId&gt;
    &lt;version&gt;beta3.SP12&lt;/version&gt;
    &lt;scope&gt;test&lt;/scope&gt;
  &lt;/dependency&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.jboss.seam.embedded&lt;/groupId&gt;
    &lt;artifactId&gt;thirdparty-all&lt;/artifactId&gt;
    &lt;version&gt;beta3.SP12&lt;/version&gt;
    &lt;scope&gt;test&lt;/scope&gt;
  &lt;/dependency&gt;

  &lt;!-- dependencies related to JBoss MicroContainer --&gt;
  &lt;!-- java.lang.NoClassDefFoundError: javax/faces/application/Application --&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;javax.faces&lt;/groupId&gt;
    &lt;artifactId&gt;jsf-api&lt;/artifactId&gt;
    &lt;version&gt;1.2_09&lt;/version&gt;
    &lt;scope&gt;test&lt;/scope&gt;
  &lt;/dependency&gt;

  &lt;!-- java.lang.NoClassDefFoundError: org/jboss/el/ExpressionFactoryImpl --&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.jboss.el&lt;/groupId&gt;
    &lt;artifactId&gt;jboss-el&lt;/artifactId&gt;
    &lt;version&gt;1.0_02.CR4&lt;/version&gt;    &lt;!-- http://seamframework.org/Community/IllegalAccessErrorAfterUpgradingTo212CR1 --&gt;
    &lt;scope&gt;test&lt;/scope&gt;
  &lt;/dependency&gt;

  &lt;!-- dependencies related to TestNG --&gt;
  &lt;dependency&gt;
    &lt;groupId&gt;org.testng&lt;/groupId&gt;
    &lt;artifactId&gt;testng&lt;/artifactId&gt;
    &lt;version&gt;5.8&lt;/version&gt;
    &lt;classifier&gt;jdk15&lt;/classifier&gt;
    &lt;scope&gt;test&lt;/scope&gt;
  &lt;/dependency&gt;
&lt;/dependencies&gt;
&lt;build&gt;
  &lt;testResources&gt;
    &lt;testResource&gt;
      &lt;directory&gt;src/test/resources&lt;/directory&gt;
      &lt;filtering&gt;true&lt;/filtering&gt;
    &lt;/testResource&gt;
    &lt;testResource&gt;
      &lt;directory&gt;src/test/bootstrap&lt;/directory&gt;
      &lt;filtering&gt;false&lt;/filtering&gt;
    &lt;/testResource&gt;
    &lt;testResource&gt;
      &lt;directory&gt;src/test/bootstrap&lt;/directory&gt;
      &lt;filtering&gt;true&lt;/filtering&gt;
      &lt;includes&gt;
        &lt;include&gt;**/*.xml&lt;/include&gt;
      &lt;/includes&gt;
    &lt;/testResource&gt;
  &lt;/testResources&gt;
  ...
&lt;/build&gt;</pre>
<p style="text-align: justify;"><span style="text-decoration: underline;">Remarque</span> : à l&#8217;heure actuelle la version la plus récente du conteneur est la beta3.SP12.</p>
<h2 style="text-align: justify;">Fichiers de tests</h2>
<p style="text-align: justify;">Dans la pratique, on ajoute toujours un fichier seam.properties vide dans le classpath des jar contenant des composants Seam. Dans le cas du test, ce fichier doit contenenir au minimum l&#8217;information sur le nom JNDI des EJB :</p>
<p class="wp-caption" style="text-align: justify;">org.jboss.seam.core.init.jndiPattern = #{ejbName}/local</p>
<p style="text-align: justify;">La classe de test doit étendre SeamTest. Elle peut ensuite utiliser l&#8217;EL pour référencer les composants Seam :</p>
<pre class="brush: java; toolbar: true;">public class ManagerActionTest extends SeamTest {
  private static Logger LOGGER = Logger.getLogger(ManagerActionTest.class);

  @Test
  public void testSayHello() {
    try {
      new ComponentTest() {
        @Override
        protected void testComponents() throws Exception {
          setValue("#{person.name}", "Yan");
          invokeMethod("#{manager.sayHello}");
          List&lt;Person&gt; fans = (List&lt;Person&gt;) getValue("#{fans}");
          assertNotNull(fans);
          assertEquals(1, fans.size());
          assertEquals("Yan", fans.get(0).getName());
          // Test le service EJB
          assertEquals(3, invokeMethod("#{manager.additionner(1, 2)}"));
        }
      }.run();
    } catch (Exception e) {
      LOGGER.error("TEST KO : " + e.getMessage());
      fail("TEST KO : " + e.getMessage());
    }
  }
}</pre>
<p style="text-align: justify;">En utilisant Hibernate, vous pouvez exécuter des scripts SQL au déploiement de votre test en ajoutant un fichier <em>import.sql</em> dans le classpath de test (src/test/resources). Cela dit,  dans ce cas, je conseillerai plutôt d&#8217;utiliser l&#8217;intégration avec DBUnit.</p>
<h2 style="text-align: justify;">Exécution</h2>
<p style="text-align: justify;">Pour exécuter les tests il faut lancer la commande <em>mvn clean test</em>.</p>
<h1 style="text-align: justify;">Variantes</h1>
<h2 style="text-align: justify;">Intégration avec DBUnit</h2>
<p style="text-align: justify;">L&#8217;intégration est possible entre seamTest et DBUnit. La classe de test doit étendre <em>DBunitSeamTest</em> et implémenter la méthode <em>prepareDBUnitOperations()</em>. Il faut aussi donner à TestNg la nom JNDI de la source de données vers la base de données ainsi que le type de la base de données (HSQL ou MYSQL). Pour cela, il faut configurer le plugin surefire comme cela :</p>
<pre class="brush: xml; toolbar: true;">&lt;build&gt;
  ...
  &lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.4.3&lt;/version&gt;
    &lt;configuration&gt;
      &lt;systemProperties&gt;
        &lt;property&gt;
          &lt;name&gt;datasourceJndiName&lt;/name&gt;
          &lt;value&gt;java:/DefaultDS&lt;/value&gt;
        &lt;/property&gt;
        &lt;property&gt;
          &lt;name&gt;database&lt;/name&gt;
          &lt;value&gt;HSQL&lt;/value&gt;
        &lt;/property&gt;
      &lt;/systemProperties&gt;
      &lt;argLine&gt;-Dsun.lang.ClassLoader.allowArraySyntax=true&lt;/argLine&gt;
    &lt;/configuration&gt;
 ...
&lt;/build&gt;</pre>
<p style="text-align: justify;"><span style="text-decoration: underline;">Remarque</span> : deux propriétés pour déclarer le type de la source de données et son nom JNDI ainsi qu&#8217;un argument pour permettre au serveur JBoss Embedded de s&#8217;éxécuter avec une JDK 1.6 (par défaut ce serveur n&#8217;est compatible qu&#8217;avec une JDK1.5).</p>
<p style="text-align: justify;">Pour information, DBUnit propose deux implémentations différentes pour décrire les données d&#8217;une base : le <a href="http://dbunit.sourceforge.net/apidocs/org/dbunit/dataset/xml/FlatXmlDataSet.html">FlatXmlDataSet</a> et le <a href="http://dbunit.sourceforge.net/apidocs/org/dbunit/dataset/xml/XmlDataSet.html">XmlDataSet</a> (<a href="http://dbunit.sourceforge.net/components.html" target="_blank">http://dbunit.sourceforge.net/components.html</a>).  SeamTest ne support que le FlatXmlDataSet.</p>
<h2 style="text-align: justify;">Dépendances sur des projets ou modules de type EJB</h2>
<p style="text-align: justify;">Dans le cas où votre module dépende d&#8217;un autre module EJB, il faut arriver à déployer la dépendance de type EJB dans le conteneur JBoss embedded. Il est possible de faire cette opération avec le plugin maven <a href="http://maven.apache.org/plugins/maven-dependency-plugin/" target="_blank">maven-dependency-plugin</a> comme cela :</p>
<pre class="brush: xml; toolbar: true;">&lt;build&gt;
  ...
  &lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-dependency-plugin&lt;/artifactId&gt;
    &lt;executions&gt;
      &lt;execution&gt;
        &lt;id&gt;copy&lt;/id&gt;
        &lt;phase&gt;process-test-resources&lt;/phase&gt;
        &lt;goals&gt;
          &lt;goal&gt;copy&lt;/goal&gt;
        &lt;/goals&gt;
        &lt;configuration&gt;
          &lt;artifactItems&gt;
            &lt;artifactItem&gt;
              &lt;groupId&gt;...&lt;/groupId&gt;
              &lt;artifactId&gt;...&lt;/artifactId&gt;
              &lt;version&gt;...&lt;/version&gt;
              &lt;type&gt;...&lt;/type&gt;
              &lt;classifier&gt;...&lt;/classifier&gt;
              &lt;overWrite&gt;false&lt;/overWrite&gt;
              &lt;outputDirectory&gt;${project.build.directory}/test-classes/deploy&lt;/outputDirectory&gt;
            &lt;/artifactItem&gt;
          &lt;/artifactItems&gt;
        &lt;/configuration&gt;
      &lt;/execution&gt;
    &lt;/executions&gt;
  &lt;/plugin&gt;
  ...
&lt;/build&gt;</pre>
<p><span style="text-decoration: underline;">Remarque</span> : la copie de la dépendance se déroule avant la phase d&#8217;exécution des tests.</p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2011/03/22/maven-et-seamtest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test unitaires : mauvaises pratiques (TDD anti-pattern)</title>
		<link>http://everythingiswrong.free.fr/index.php/2011/03/20/test-unitaires-mauvaises-pratiques-tdd-anti-pattern/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2011/03/20/test-unitaires-mauvaises-pratiques-tdd-anti-pattern/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 14:28:12 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Tests unitaires]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false">http://yan.langlois.free.fr/wordpress/?p=983</guid>
		<description><![CDATA[Connaitre les mauvaises pratiques de développement des tests unitaires (JUnit, TestNg, etc.).]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Depuis pas mal de temps, je me pose des questions sur les bonnes pratiques à mettre en œuvre dans le développement de mes tests unitaires. N&#8217;ayant jamais rencontré de personne ayant beaucoup d&#8217;expérience dans le domaine, je me suis toujours restreint à développer des tests :</p>
<ul>
<li>Rapides à développer</li>
<li>Faciles à maintenir</li>
<li>limités à une fonctionnalité</li>
</ul>
<p style="text-align: justify;">C&#8217;est dans ce contexte que j&#8217;ai cherché sur internet des propositions de bonnes pratiques sur les tests unitaires automatisés. J&#8217;ai trouvé mieux : des pratiques à éviter (<a href="http://blog.james-carr.org/2006/11/03/tdd-anti-patterns/" target="_blank">http://blog.james-carr.org/2006/11/03/tdd-anti-patterns/</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2011/03/20/test-unitaires-mauvaises-pratiques-tdd-anti-pattern/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
