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

Maven Java Discussion :

Test unitaire JDBC Postgresql


Sujet :

Maven Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut Test unitaire JDBC Postgresql
    Bonjour à tous,

    Je veux faire des test unitaires pour savoir si je me connecte bien à ma base de données mais je tombe sur cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.servlet.ServletException: 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
    Sans passer par des tests unitaires la connexion se fait correctement, mais lorsque je lance mvn -test cela me renvoie l'erreur.

    Je pense que cela vient des JNDI. Il manque les références pour se connecter à la base de données car lorsque je lance mon web service avec tomcat, vu que le fichier qui contient les références se trouve dans un dossier de tomcat il n'y a pas de problèmes.

    Comment faire pour arriver à se connecter à la base de données et faire des test unitaires dessus ?

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    les test unitaire sont en général des application autonome, ils ne tournent pas dans une conteneur web.


    En général, pour ce qui nécessite du jndi pendant le test, j'ai tendance à utiliser la librairie simplejndi, qui permet facilement de créer un contexte jndi avec des datasources dedans.

    Pour ce qui est de la base de données, en général j'utiliser une base type h2 ou derby, entièrement java, ça m'évite de devoir configurer des base type oracle / mysql spécifiquement pour les tests. Avec ça je suis certain de ne pas affecter la prod.

  3. #3
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    Merci pour ta réponse.

    J'utilise Eclipse donc mes tests sortent dans la console et pour la base de données j'utilise postgres.

    Je suis allé voir la doc pour la lib, ils disent de créer un fichier jndi.properties, le ziper, l'importer sur eclipse, créer un autre fichier database.properties, mettre les informations de la base de données et le mettre a côté de jndi.properties. C'est bien ça ?

    Mais ensuite niveau java, on récupère comment les jndi avec cette lib ?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    zipper et importer sur eclipse ?

    non non.
    Tu rajoute cette librairie dans ton projet eclipse (histoire que tes test y aien accès)

    Tu crée un fichier jndi.properties dans les ressources de ton project (src/java, src/ressource , tout dépend comment tu as créé ton projet)
    et dans lequel tu met les informations, a savoir
    java.naming.factory.initial et org.osjava.sj.root

    ensuite, simplejndi utilise simplement la hierarchie située sous le root, un fichier = une entrée dans le jndi. Il y a dans la doc un exemple pour une datasource


    Pour le reste, tu n'a rien à changer dans ton code, avec cette config, dès qu'un bout de code demandera un accès au jndi, il tombera sur le simple jndi

  5. #5
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    dans le fichier properties je dois mettre java.naming.factory.initial et org.osjava.sj.root. Mais les informations de la base de données ? je les mets où ? Dedans aussi ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    regarde la doc, c'est indiqué comment créer la datasource ^^

    je vais quand même pas faire un copier coller de la doc

  7. #7
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    Ben j'ai suivi la doc :

    - j'ai mis la dependencie de la lib dans le pom.xml

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		<dependency>
    			<groupId>simple-jndi</groupId>
    			<artifactId>simple-jndi</artifactId>
    			<version>0.11.4.1</version>
    		</dependency>

    - Un fichier jndi.properties dans src/main/ressources/ qui contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    java.naming.factory.initial=org.osjava.sj.SimpleContextFactory
    org.osjava.sj.root=configFileDirectory
    - et un fichier database.properties dans le meme répertoire qui contient les info de ma base de données pour me connecter c'est bon ?

  8. #8
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    javax.servlet.ServletException: java.lang.IllegalArgumentException: java.io.File parameter must be a directory. [configFileDirectory]

    J'obtiens cette erreur du coups

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    la doc ne parle pas d'un fichier database.properties, mais d'un fichier ds.properties, a mettre dans le dossier correspondant au chemin jndi que tu veux créer.

    Voir le fichier manual/DataSources.html dans la doc de simple jndi pour les détails


    The most popular object to get from JNDI is a object of type javax.sql.DataSource, allowing the developer to obtain JDBC connections to databases. Simple-JNDI supports this out of the box.

    There are four mandatory parameters for a DataSource in Simple-JNDI, and four optional parameters (see next section). The mandatory parameters are url, driver, user, password. The following shows an example of a DataSource that will be available under the lookup key application1/ds/TestDS.
    application1/ds.properties

    TestDS.type=javax.sql.DataSource


    TestDS.driver=org.gjt.mm.mysql.Driver


    TestDS.url=jdbc:mysql://localhost/testdb


    TestDS.user=testuser


    TestDS.password=testing


    The code to obtain it would be:

    InitialContext ctxt = new InitialContext();
    DataSource ds = (DataSource) ctxt.lookup("application1/ds/TestDS");


    This example uses a delimiter of '/', which must be set with the org.osjava.sj.delimiter property.

  10. #10
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    Donc je laisse mon fichier jndi.properties, je renomme mon fichier database en ds.properties

    Mais pour ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    InitialContext ctxt = new InitialContext();
    DataSource ds = (DataSource) ctxt.lookup("application1/ds/TestDS");
    On est obligé de mettre le chemin vers le fichier ds.properties ?

    Parce que dans mon code j'ai ceci et j'aimerais le garder tel quel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                InitialContext initialContext = new InitialContext();
                Context context = (Context)initialContext.lookup("java:comp/env");
     
                DataSource ds = (DataSource) context.lookup("jdbc/upload");
                Connection connection = ds.getConnection();

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Johngtrs Voir le message
    On est obligé de mettre le chemin vers le fichier ds.properties ?
    Ce code est un exemple d'utilisation de JNDI. Dans ton cas, tu utilise déjà jndi (d'ou ton message d'erreur d'origine) et le but c'est de fournir un conteneur jndi (simpel jndi) car tes unit test n'en ont pas ce qui fait foirer tes test.
    Parce que dans mon code j'ai ceci et j'aimerais le garder tel quel :
    Ben dans ce cas tu dois avoir un fichier jdbc.properties, et dans le fichier jdbc.properties tu crée une datasource appelée "upload". Donc par rapport à l'exemple,
    le dossier application1 disparait
    ds deviens jdbc
    TEST deviens upload


    Maintenant, si tu préfère, il existe une solution alternative au fichier de config, c'est de créer la datasource dans le setup du test unitaire et de la brancher manuellement dans le simplejndi. L'inconvénient c'est que tu te tappe le travail dans chaque test


    un exemple: http://www.briskbee.com/2010/07/sett...utside-of.html

  12. #12
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    J'obtiens toujours la même erreur

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    laquelle des deux?

  14. #14
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    java.io.File parameter must be a directory. [configFileDirectory]

  15. #15
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu n'as pas une stacktrace de l'exception?? Parce que là je n'ai pas la moindre idée d'où elle sort, mais une servletexception, ca ne viens pas de jndi.

  16. #16
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    Je ne peux pas faire de stacktrace dans ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Connection dbc() throws NamingException, SQLException, ServletException{
            try {
                InitialContext initialContext = new InitialContext();
                Context context = (Context)initialContext.lookup("java:comp/env/");
     
                DataSource ds = (DataSource) context.lookup("jdbc/upload");
     
                Connection connection = ds.getConnection();
                return connection;
            } catch (Exception e) {
                throw new ServletException(e);
            }
        }

  17. #17
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu peux faire temporairement un e.printStackTrace avant de relancer l'exception. Ou, au plus haut niveau, là où tu récupère l'exception, tu fait un printStackTrace.

  18. #18
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    En fait j'avais pas changé le paramètre dans le fichier jndi.properties pour spécifier le chemins des .properties :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    java.naming.factory.initial=org.osjava.sj.SimpleContextFactory
    org.osjava.sj.root=configFileDirectory
    J'avais laissé "configFileDirectory", donc je viens de remplacer par src/main/resources.

    Mais maintenant j'ai une autre erreur : javax.servlet.ServletException: java.lang.NullPointerException

  19. #19
    Membre éclairé
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Juin 2010
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste développeur

    Informations forums :
    Inscription : Juin 2010
    Messages : 317
    Par défaut
    Problème résolu en fait il fallait que j'enlève le / après le env sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Context context = (Context)initialContext.lookup("java:comp/env/");
    Parce que dans mon jndi.properties je n'avais pas mis de slash.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.osjava.sj.space=java:comp/env
    Du coups il ne trouvait pas l'environnement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tests Unitaires - Production de documents
    Par giviz dans le forum Test
    Réponses: 13
    Dernier message: 07/02/2005, 08h41
  2. Tests unitaires en C#
    Par Bouboubou dans le forum Test
    Réponses: 2
    Dernier message: 01/10/2004, 13h03
  3. [TESTS] Tests unitaires
    Par mathieu dans le forum Test
    Réponses: 4
    Dernier message: 08/01/2004, 12h59
  4. JBuilder 8 et JDBC/PostgreSQL
    Par nicox dans le forum JBuilder
    Réponses: 2
    Dernier message: 14/05/2003, 15h43

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