2009-11-10 6 views
2

Pour les tests de certaines petites applications d'entreprise JBoss, je voudrais utiliser JUnit et le Maven Cargo plugin. (Je sais qu'il y a aussi JSFUnit mais je voudrais d'abord regarder de plus près Cargo.)Où puis-je trouver un exemple complet de plug-in Maven Cargo pour les tests EJB?

Existe-t-il un exemple simple disponible en ligne que je pourrais utiliser comme référence pour exécuter un test JUnit qui appelle une opération EJB en utilisant JBoss (4.2 ou 5.1) en utilisant le plugin Maven Cargo? J'ai trouvé quelques bonnes introductions à la configuration, mais je reçois des messages d'erreur dans la recherche EJB, il serait donc utile de voir comment il devrait être utilisé.

Voici le code de test en utilisant InitialContext:

public void testEcho() { 
    assertEquals("Echo Echo", lookupEchoBeanRemote().Echo("Echo")); 
} 

private EchoBeanRemote lookupEchoBeanRemote() { 
    try { 
     Context c = new InitialContext(); 
     return (EchoBeanRemote) c.lookup("EchoBean/remote"); 
    } catch (NamingException ne) { 
     Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne); 
     throw new RuntimeException(ne); 
    } 
} 

Ce qui donne cette erreur:

testEcho(de.betabeans.Echo2Test) Time elapsed: 0.885 sec <<< ERROR! 
java.lang.reflect.UndeclaredThrowableException 
    at $Proxy3.Echo(Unknown Source) 
    at de.betabeans.Echo2Test.testEcho(Echo2Test.java:17) 
Caused by: java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.jboss.ejb3.security.client.SecurityActions.createSecurityContext(SecurityActions.java:657) 
    at org.jboss.ejb3.security.client.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:59) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62) 
    at $Proxy4.invoke(Unknown Source) 
    at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207) 
    at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164) 
    ... 28 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at org.jboss.security.SecurityContextFactory.createSecurityContext(SecurityContextFactory.java:117) 
    at org.jboss.security.SecurityContextFactory.createSecurityContext(SecurityContextFactory.java:76) 
    at org.jboss.ejb3.security.client.SecurityActions$1.run(SecurityActions.java:662) 
    ... 38 more 
Caused by: java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/security/jacc/PolicyContextException 
    at java.lang.ClassLoader.defineClass1(Native Method) 

Si j'utilise l'annotation EJB

@EJB(beanInterface=EchoBeanRemote.class,mappedName="EchoBean/remote") 
private EchoBeanRemote newSessionBean; 

public Echo3Test(String testName) { 
    super(testName); 
} 

public void testEcho() { 
    assertEquals("Echo Echo", newSessionBean.Echo("Echo")); 
} 

Le résultat du test est

testEcho(de.betabeans.Echo3Test) Time elapsed: 0.001 sec <<< ERROR! 
java.lang.NullPointerException 
    at de.betabeans.Echo3Test.testEcho(Echo3Test.java:20) 

jndi.properties se trouve dans le dossier racine jar EJB et contient ces lignes:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces 
java.naming.provider.url=jnp://localhost:1099 
### The TimedSocketFactory connection timeout in milliseconds (0 == blocking) 
jnp.timeout=0 
### The TimedSocketFactory read timeout in milliseconds (0 == blocking) 
jnp.sotimeout=0 

Le code source de haricot est

package de.betabeans; 

import javax.ejb.Remote; 

@Remote 
public interface EchoBeanRemote { 
    String Echo(final String in); 
} 
package de.betabeans; 

import javax.ejb.Stateless; 

@Stateless 
public class EchoBean implements EchoBeanRemote { 
    public String Echo(final String in) { 
     return in + " " + in; 
    } 
} 

J'ai également testé une application web qui peut appeler le EJB sans problèmes - dans les deux sens, avec InitialContext ou une annotation. Un avertissement que j'ai reçu dans le déploiement de l'application Web a été

WARN [MappedReferenceMetaDataResolverDeployer] références non résolues dans JBossWebMetaData: [# web-app: AnnotatedEJBReferenceMetaData {name = de.betabeans.Echo3Servlet/echoBean, type ejb-ref = null, link = null, ignorer-dependecy = faux, mappé/jndi-name = EchoBean/distant, résolu-jndi-name = null, beanInterface = interface de.betabeans.EchoBeanRemote}, # web-app: AnnotatedEJBReferenceMetaData {name = NewServlet/newSessionBean, ejb-ref-type = null, link = null, ignore-dependecy = faux, mappé/jndi-name = NewSessionBean/distant, résolu-jndi-name = null, beanInterface = interface de.betabeans.NewSessionBeanRemote}] 12: 26: 11,770 INFO

Tous les tests effectués avec JBoss 5.1.0.GA sur deux diffèrent ent construire des systèmes.

J'ai téléchargé le projet Maven complet maintenant http://www.mikejustin.com/download/JBossSimpleEJBApp-ejb-test.zip

+0

Il y a beaucoup d'échantillons Cargo + JBoss sur le Web par exemple http://i-proving.ca/space/Technologies/Maven/Maven+Recipes/Deploy+to+JBoss+using+Cargo ou http://www.vineetmanohar.com/2009/05/26/maven-cargo- jboss /. Mais il y a plusieurs façons d'utiliser Cargo aussi alors peut-être que vous devriez coller votre pom et l'erreur ici pour que nous puissions vous aider. Quel est le problème en réalité? –

+0

Je reçois cette exception: javax.naming.NoInitialContextException: Impossible d'instancier la classe: org.jnp.interfaces.NamingContextFactory [L'exception racine est java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory] – mjn

+0

Cela peut être corrigé en ajoutant jbossall- client.jar au POM, mais le je cours dans une exception classcast si j'utilise la méthode de recherche de contexte. Je n'ai pas de fichier de configuration jboss.xml et essaye maintenant de configurer l'EJB là. Si j'utilise une annotation @EJB, j'obtiens une exception de pointeur nul. – mjn

Répondre

5

EDIT: après ajouté les sources

tout d'abord - mon exemple fonctionne sur JBoss 4.2.3.GA et Cargo 1.0 J'ai fait quelques Refactorisation de votre code:

pom.fichier xml

<groupId>de.betabeans</groupId> 
    <artifactId>JBossSimpleEJBApp-ejb-test</artifactId> 
    <packaging>ejb</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>JBossSimpleEJBApp-ejb JEE5 EJB Test</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
     <dependency> 
       <groupId>javax.ejb</groupId> 
       <artifactId>ejb-api</artifactId> 
       <version>3.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>jboss</groupId> 
      <artifactId>jboss-ejb3</artifactId> 
      <version>4.2.3.GA</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.jboss.client</groupId> 
      <artifactId>jbossall-client</artifactId> 
      <version>4.2.3.GA</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <repositories> 
      <repository> 
       <releases> 
        <enabled>true</enabled> 
       </releases> 
       <snapshots> 
        <enabled>true</enabled> 
        <updatePolicy>always</updatePolicy> 
       </snapshots> 
       <id>repository.jboss.com</id> 
       <name>Jboss Repository for Maven</name> 
       <url>http://repository.jboss.com/maven2/</url> 
       <layout>default</layout> 
      </repository> 
    </repositories> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.0.2</version> 
       <configuration> 
        <source>1.5</source> 
        <target>1.5</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-ejb-plugin</artifactId> 
       <version>2.1</version> 
       <configuration> 
        <ejbVersion>3.0</ejbVersion> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.cargo</groupId> 
       <artifactId>cargo-maven2-plugin</artifactId> 
       <version>1.0</version> 
       <configuration> 
        <container> 
         <containerId>jboss42x</containerId> 
         <home>${jboss.home}</home> 
         <append>false</append> 
        </container> 
        <configuration> 
         <type>existing</type> 
         <home>${jboss.home}/server/default</home> 
         <properties> 
          <cargo.jboss.configuration>default</cargo.jboss.configuration> 
          <cargo.rmi.port>1099</cargo.rmi.port> 
          <cargo.logging>high</cargo.logging> 
         </properties> 
        </configuration> 
        <wait>false</wait> 
       </configuration> 
       <executions> 
        <execution> 
         <id>start-container</id> 
         <phase>pre-integration-test</phase> 
         <goals> 
          <goal>start</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>stop-container</id> 
         <phase>post-integration-test</phase> 
         <goals> 
          <goal>stop</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <skip>true</skip> 
       </configuration> 
       <executions> 
        <execution> 
         <id>surefire-it</id> 
         <phase>integration-test</phase> 
         <goals> 
          <goal>test</goal> 
         </goals> 
         <configuration> 
          <skip>false</skip> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
     <finalName>JBossSimpleEJBApp-ejb-test</finalName> 
    </build> 

J'ai changé votre pom dans les sections suivantes:

  • dependecies (vous utilisez ejb-api de Glasfish)
  • dépôts (Je vous conseille d'utiliser JBoss Maven2 en défaut de mise en page)
  • la version
  • et containerId de marchandises-maven2-plugin

Je suis déplacé dossier de ressources dans le dossier tester

jndi.properties fichier doit être utilisé par un test (non haricots) et peut être la suivante ou que vous avez:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces 
java.naming.provider.url=localhost 

La configuration orher les fichiers (jboss.xml, MANIFEST.MF) ne sont pas nécessaires.

Configuration du serveur
Le plus gros problème avec le serveur Jboss 4.2.3.GA et le fichier ejb.jar est qu'il ne fonctionne pas par défaut! Description du problème et contournement vous pouvez trouver here. (Ce fut la chose la plus difficile. Dans le serveur Jboss 5.0 ce problème n'existe pas, mais dans maven-cargo-plugin ce conteneur est comme expérimental)

C'est tout
Ci-dessous je coller des liens vers des références, si vous aurez encore des problèmes je vous enverrai mon projet fixe entier.


Ma réponse originale
Il y a plusieurs problèmes avec Cargo et JBoss. La raison principale est que la configuration de la source de données dans pom ne fonctionne pas, vous devez donc déployer un fichier de sources de données distinct. Du point de vue de JBoss, il doit s'agir d'un fichier placé dans le répertoire de déploiement principal (car Tomcat se trouve dans le dossier META-INF). La deuxième tâche est de copier la bibliothèque jdbc avant l'exécution de la cargaison.

Une excellente ressource pour vous est ce poste de Carlos Sanchez blog. Peut-être que vous pouvez utiliser à la place Sélénium JSFUnit aussi :)

Pour copier le fichier source de données j'utiliser la configuration suivante:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-resources-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>copy-ds-context</id> 
        <goals> 
         <goal>copy-resources</goal> 
        </goals> 
        <phase>pre-integration-test</phase> 
        <configuration> 
         <outputDirectory>${jboss.deploy-ds.dir}</outputDirectory> 
         <resources> 
          <resource> 
           <directory>${basedir}/src/main/webresources/META-INF</directory> 
           <filtering>true</filtering> 
           <includes> 
            <include>context-ds.xml</include> 
           </includes> 
          </resource> 
         </resources> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

Un grand merci pour votre réponse qui pourrait être utile à l'avenir - dans mon projet exemple très basique actuel, il n'y a pas de sources de données impliquées. – mjn

+0

Fonctionne très bien - votre aide est très appréciée! – mjn

Questions connexes