IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

Comment tester un EJB 3 ?


Sujet :

Java EE

  1. #1
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 608
    Par défaut Comment tester un EJB 3 ?
    Mon EJB 3 déployé, j'ai cherché des outils pratiques pour me permettre de le tester.

    L'un d'entre-eux était ejb3Unit, mais il ne soutient pas JUnit 4 (seulement le 3) ce qui me pose des difficultés pour la prévention des timeouts et le rend inéligible.

    Quel environnement mettez-vous en place pour tester vos EJB 3?

    Un environnement "out of container"? Si oui, lequel? Quelles sont vos expériences?

    Lors de vos tests, utilisez-vous la substitution de bases de données que permet souvent l'outil? Utilisez-vous les objets simulacres (mock) pour redéfinir les réponses de vos DAOs ou de vos services?


    Je suis face au cas suivant:
    (je ne mets pas dedans tout les try-catch qui devraient y figurer pour le code soit compilable. C'est juste une illustration).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    @Stateless public class MonBean
    {
           public void accepterAchat(PersonneId id, Commande c)
           {
                IPersonnesDAO daoPersonnes = PersonnesDAOFactory.getInstance();
                Personne p = daoPersonnes.find(id);
     
                ServiceComptabilité compta = ctx.lookup("LaCompta");
     
                if (compta.clientSolvable(p))
                {
                     Grossiste grossiste = ctx.lookup("MonGrossiste");
     
                     if (grossiste.possedeArticles(c.listeArticles()))
                     {
                         ICommandesDAO daoCommandes = CommandesDAOFactory.getInstance();
     
                         if (daoCommande.exist(c.getId()) == false)
                            daoCommande.insert(c);
                     }
                }
           }
    }
    Admettons que sur ce service je souhaite faire les tests qui suivent, quel serait le meilleur environnement que vous consitueriez pour faciliter leur réalisation?

    1) Une personne d'un identifiant donné, on la trouve bien.

    2) On donnerait une personne bidon (ici par un daoPersonne simulacre) la compta ne se ferait pas avoir et la repèrerait.

    3) Quoi qu'ait dit la compta (ici un service Compta simulacre), le grossiste, lui, arrive toujours à fonctionner dans le cadre de ce service là. (bien entendu, il serait plus habile de tester le service grossiste dans ses tests dédiés. Mais là, on veut le tester dans cette situation).

    4) Quand tout est bon, on arrive à insérer une commande en base.

    etc.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut EJB3 Tests Unitaires
    Bonjour,

    Peut on faire des tests Unitaires dans le conteneur EJB, Comment peut tester avec Netbeans 6.1 apres avoir generer le tests de sa session bean ou de son entite bean.
    Est on oblige d utiliser EntityMangerFactory et Entimanager dans le test a l intereieur du conteneur.

    Si on veut le faire en dehors du conteneur ejb avez des tutos a m indiquer ,

    Merci a vous

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    En effet, l'écriture de tests pour les EJB 3 n'est pas chose aisée.

    Pourtant, on peut s'en sortir en utilisant jboss-ejb3-microcontainer.

    Ce dernier permet d'instancier un "conteneur léger" dans une application Java classique qui contient l'ensemble des EJB à tester.

    Une autre solution consiste à utiliser Spring et un fichier applicationContext.xml qui contient les définitions des beans pour recrér les services d'un container d'EJB classique - EntityManagerFactory, JPATransactionManager, etc.)

    Le dernière solution, de loin la plus simple consiste à déployer ses EJB dans le container, puis d'écrire un test unitaire qui au démarrage, instancie un InitialContext comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private MonEJBInterfaceRemote service;
     
    @BeforeClass
    public static void setUpClass() throws Exception {
         Context annuaire = new InitialContext();
         service = (MonEJBInterfaceRemote) annuaire.lookup(MonEJBInterfaceRemote.class.getName());
    }
     
    @Test
    public void unTest() {
         service.maMethodeMetier();
         (...)
    }
    Bien entendu, il est nécessaire de préciser dans le classpath les propriétés JNDI. Cela peut se faire via l'écriture d'un fichier properties intitulé "jndi.properties" placé dans le package par défaut "Test Packages" de Netbeans.

    Ce fichier devra contenir les informations de connexions à l'annuaire JNDI. Par exemple, pour Glassfish ->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #Contenu de jndi.properties
     
    java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory
    java.naming.factory.url.pkgs=com.sun.enterprise.naming
    java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
    org.omg.CORBA.ORBInitialHost=IP_DU_SERVEUR_GLASSFISH
    org.omg.CORBA.ORBInitialPort=3700  #(valeur par défaut)
    De cette manière, on peut tester les EJB déployés en bénéficiant de tous les services du container. Bien entendu, on ne peut faire cela que si les EJB ont une interface Remote avec la balise @Remote

    J'allais oublier. Il faut rajouter dans le classpath du projet les références aux jars suivants qui se trouvent dans %GLASSFISH_HOME%/lib :

    appserv-deployment-client.jar
    appserv-rt.jar
    webservices-rt.jar (si tu utilises des services Web Glassfish - projet METRO)
    appserv-admin.jar
    javaee.jar
    toplink-essentials-agent.jar (si tu veux accéder à l'EntityManager directement)
    toplink-essentials.jar (si tu veux accéder à l'EntityManager directement)
    imqjmsra.jar (si tu veux tester un EJB MDB - ce jar se trouve dans %GLASSFISH_HOME%/lib/install/applications/jmsra)

    Voilà, cette dernière solution permet donc de tester tes EJB. Ces derniers doivent être bien entendus déployés dans le container au préalable mais de cette manière, tu es le plus proche d'un environnement de production.

    A+

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut Merci
    C est Limpide, clair et concis, je vais le tester ce soir,
    Merci

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut Bugs
    Bonjour, j ai fait le test comme dit,
    j ai cree le fichier jndi.properties au package default dans le package test packages du jar
    et voila l erreur qui est affichée,

    merci d m aider


    Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
    javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at com.glci.persistence.facade.GestionEvenementFacadeBeanTest.setUpClass(GestionEvenementFacadeBeanTest.java:43)

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    Peut-être que ton fichier n'est tout simplement pas au bon endroit.

    L'exécution se fait souvent à la racine du projet (à voir pour les tests).

    Mets plutôt le fichier jndi au niveau de la racine du projet et non dans le package default du package test, on ne sait jamais. Car là effectivement, on dirait que les configuration du JNDI ne sont pas faites.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    En effet, cela devrait fonctionner dans "Source Packages", à la racine.

    Sinon, vérifies que tu as bien fait un "build complet" avant de lancer les tests (clic droit sur le projet -> Build)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut TOUJOURS PAS
    Merci pour vos interventions, c est gentil

    Pour moi ça marche toujours pas,

    Je recapitule sous netbeans 6.1, J ai crée une Entrprise App, avec ejb module et web module.

    Dans ejb module, j ai cree un staless session Bean "maSessionBean" qui implemente interface @Remote
    J 'ai fait une seule méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public String getResult(){
     
    return " je veux faire marcher des tests JUnit avec EJB3";
    }
    Pour les Test, A partir du ejb module, j ai fait un new Junit Test,
    le fichier prend le nom de "maSessionBeanTest" qui se se trouve dans le ejb module sous Test packages
    Dans ce fichier "maSessionBeanTest"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private static maSessionBeanRemote ejb;
     @Before
        public  void setUpClass() throws NamingException {
             InitialContext ctx = new InitialContext();
             ejb = (maSessionBeanRemote) ctx.lookup("maSessionBeanRemote.class.getName()");  
        }
     
    @Test
    public void test(){
    ejb.getResult();
     
    }
    Quand je clean et Build, undeploy/deploy et je run le fichier Test, il me dit toujours erreur
    ce que j ai note plus haut, j ai egalement crée un fichier propriete jndi.properties dans la racine du projet et j ai tous les jars et folders appserv.rt, javaee.jar, ... qui sont sous glassfish

    Voila ou j en suis
    Merci à tous

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    donc toujous probleme

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    En effet. Ton classpath contient-il les jars suivants :

    appserv-deployment-client.jar
    appserv-rt.jar
    webservices-rt.jar
    appserv-admin.jar
    javaee.jar
    toplink-essentials-agent.jar
    toplink-essentials.jar

    Ces derniers doivent-être dans le classpath du projet. Clic droit, sur le projet, puis properties. Il doit y avoir un onglet Test ou Run Tests dans la partie libraries. En effetn il ne sert à rien d'ajouter ces jars dans l'onglet Classpath du Source Packages.

    Enfin, fait un clean puis un build. Veille à ce que ton serveur d'application soit bien lancé et lance ton Test. -> Clic droit sur ton test puis Run.

    Il faut avoir fait un build avant de lancer le test, sinon, il ne trouve pas les dépendances requises pour executer le test.

    Ensuite, ton bean implémente une interface remote. Tu ne peux tester que les beans implémentant une interface @Remote. Ton code pose pb car déjà il lui fait respecter la spec JavaBeans qui dit que ta classe doit commencer par une majuscule. Deuxièmement, le bean est accessible par le nom de la classe par défaut donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private static maSessionBeanRemote ejb;
     @Before
        public  void setUpClass() throws NamingException {
             InitialContext ctx = new InitialContext();
             ejb = (maSessionBeanRemote) ctx.lookup("maSessionBeanRemote.class.getName()");  
        }
     
    @Test
    public void test(){
    ejb.getResult();
     
    }
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private static MaSessionBeanRemote ejb;
     @Before
        public  void setUpClass() throws NamingException {
             InitialContext ctx = new InitialContext();
             ejb = (MaSessionBeanRemote) ctx.lookup(MaSessionBeanRemote.class.getName());  // attention, enleves les guillements
        }
     
    @Test
    public void test(){
    ejb.getResult();
     
    }
    Tiens-nous au courant.

    Bon courage, tu vas y arriver. Les EJB 3 sont extrêmement simples, il n'y a pas de raison que tu échoues.

  11. #11
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    Bonjour, je dois moi aussi tester des ejb3 avec junit et je suis tombe sur ce topic.
    J'ai donc suivi en details les instructions cependant je rencontre une exception
    Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)

    Tous les jar cites sont bien present dans le repertoire lib de glassfish, mon fichier jndi.properties est places dans le source package de mon projet ejb.

    voici son contenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #Contenu de jndi.properties
     
    java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory
    java.naming.factory.url.pkgs=com.sun.enterprise.naming
    java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
    org.omg.CORBA.ORBInitialHost=xxxxxxxxxxxx
    org.omg.CORBA.ORBInitialPort=3700  #(valeur par défaut)
    Est ce que quelqu 'un a reussit a faire marcher les junit avec des ejb3, ma configuration est la suivante j'utilise netbeans+glassfish pour le developement.

    cyberskype as tu finalement reussit a faire fonctionner tous ca ou a tu utilise une autre solution.

    bonne journee

    Pascal

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    Salut Pascal,

    Je crois que ton problème vient du fait que les JAR en question ne se trouvent pas dans le classpath de l'environnement TEST (onglet Run Tests des Properties du projet).

    Pour info, tu trouveras ci-joint un zip de 16 captures d'écran montrant un exemple de A à Z. J'espère qu'il te paraîtra suffisamment clair.

    Enfin, le fichier jndi.properties est ignoré par le classpath lorsque le test est lancé si le test JUnit est écrit dans le module EJB. Il faut donc renseigner les propriétés manuellement ou bien écrire un autre projet qui référence le module EJB et placer le fichier jndi.properties dans le <default package> de ce nouveau projet.

    Bon courage.

    Séb.

  13. #13
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    merci pour ta reponse sui rapide mais comment je recupere le zip.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    Voici la partie II. AS-tu pu récupérer les pièces jointes ?

  15. #15
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    j ai recupere la partie 1 mais y plus la partie 2

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    OK, je ne peux pas mettre toutes les pièces jointes car pas suffisamment d'espace... Je mets donc la partie I. Une fois que tu l'auras récupérée, laisse-moi un post et je mettrais la partie II.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    Peux-tu me confirmer que tu as pu retirer la partie 1 ?

  18. #18
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    c est bon j ai la partie 1 est ce que tu peux me mettre la partie 2 stp

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Par défaut
    Et voici la partie 2.
    Fichiers attachés Fichiers attachés

  20. #20
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    yeahhh ca marche merci bcp

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2014, 22h51
  2. [EJB] Comment tester un ejb ?
    Par clement42 dans le forum Java EE
    Réponses: 3
    Dernier message: 05/12/2005, 11h22
  3. Réponses: 10
    Dernier message: 06/07/2004, 02h44
  4. comment tester si une fonction fait bien son travail
    Par access dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/11/2003, 15h46
  5. Réponses: 10
    Dernier message: 18/11/2003, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo