web-dev-qa-db-fra.com

Configuration de la source de données JNDI dans jUnit

J'essaie de mettre en place des tests jUnit. Notre base de données est connectée par le serveur via JNDI. Nous avons un fichier XML décrivant la configuration dans root.xml. Comment configurer jUnit pour se connecter à la base de données? Je préférerais qu'il lise simplement le contenu de root.xml, mais je suis prêt à le configurer de toute façon, cela fonctionne.

13
Joe

J'ai trouvé que la meilleure façon de le faire est d'utiliser quelque chose appelé Simple-Jndi .

J'ai ajouté ceci au fichier maven:

    <dependency>
        <groupId>simple-jndi</groupId>
        <artifactId>simple-jndi</artifactId>
        <version>0.11.4.1</version>
        <scope>test</scope>
    </dependency>

Vous pouvez télécharger le package ici, le téléchargement contient un manuel d'instructions. http://code.google.com/p/osjava/downloads/detail?name=simple-jndi-0.11.4.1.Zip&can=2&q=

Après avoir ajouté à à votre projet, il vous suffit d'ajouter quelques fichiers de propriétés, conformément aux instructions. 

Cependant, après avoir ajouté la dépendance, je pense que vous pouvez ajouter vos ressources jndi par programmation au lieu d'utiliser des fichiers de propriétés. Vous faites quelque chose comme ceci: (new InitialContext ()). Rebind ("datasource", myDatasource); 

9
Joe

J'ai trouvé ce blog: https://blogs.Oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit

À propos de la source de données H2: http://www.h2database.com/javadoc/org/h2/jdbcx/JdbcConnectionPool.html

Donc pour mon code:

package com.example.test;

import Java.sql.Connection;
import Java.sql.ResultSet;
import Java.sql.Statement;
import Java.util.ArrayList;
import Java.util.List;
import Java.util.logging.Level;
import Java.util.logging.Logger;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.h2.jdbcx.JdbcConnectionPool;

import junit.framework.TestCase;

public class JunitDataSource extends TestCase {

    public void setUp() throws Exception {
        // rcarver - setup the jndi context and the datasource
        try {
            // Create initial context
            System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.Apache.naming.Java.javaURLContextFactory");
            System.setProperty(Context.URL_PKG_PREFIXES, "org.Apache.naming");
            InitialContext ic = new InitialContext();

            ic.createSubcontext("Java:");
            ic.createSubcontext("Java:/comp");
            ic.createSubcontext("Java:/comp/env");
            ic.createSubcontext("Java:/comp/env/jdbc");

            JdbcConnectionPool ds = JdbcConnectionPool.create(
                    "jdbc:h2:file:src/main/resources/test.db;FILE_LOCK=NO;MVCC=TRUE;DB_CLOSE_ON_EXIT=TRUE", "sa", "sasasa");
            // Construct DataSource
            // OracleConnectionPoolDataSource ds = new
            // OracleConnectionPoolDataSource();
            // ds.setURL("jdbc:Oracle:thin:@Host:port:db");
            // ds.setUser("MY_USER_NAME");
            // ds.setPassword("MY_USER_PASSWORD");

            ic.bind("Java:/mydatasourcename", ds);
        } catch (NamingException ex) {
            Logger.getLogger(JunitDataSource.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void testSimple() throws Exception {

        // Obtain our environment naming context
        Context initCtx = new InitialContext();

        // Look up our datasource
        DataSource ds = (DataSource) initCtx.lookup("Java:/mydatasourcename");

        Connection conn = ds.getConnection();
        Statement stmt = conn.createStatement();

        ResultSet rset = stmt.executeQuery("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES");


        while (rset.next()) {
          System.out.println("<<<\t"+rset.getString("TABLE_NAME"));
        }


    }

}

Note : Je devais ajouter la bibliothèque Tomcat et les fichiers JAR du répertoire bin de Tomcat pour que cela fonctionne.

14
FloFu

J'ai utilisé Simple-JNDI à cet effet depuis des années. Il vous donne une implémentation en mémoire d'un service JNDI et vous permet de renseigner l'environnement JNDI avec des objets définis dans des fichiers de propriétés. Il est également possible de charger des sources de données ou des pools de connexions configurés dans un fichier.

Pour obtenir un pool de connexion, vous devez créer un fichier comme celui-ci:

type=javax.sql.DataSource
driver=com.sybase.jdbc3.jdbc.SybDriver
pool=myDataSource
url=jdbc:sybase:Tds:servername:5000
user=user
password=password 

Dans votre application, vous pouvez accéder à la piscine via

Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("path/to/your/connectionPool");

Vous pouvez trouver plus d'informations à ce sujet sur https://github.com/h-thurow/Simple-JNDI .

TomcatJNDI aide également à résoudre ce problème. Il peut traiter les fichiers de configuration de Tomcat et créer le même environnement JNDI que Tomcat, mais sans démarrer un serveur. Vous pouvez donc exécuter des classes dépendantes de l’environnement JNDI de Tomcat dans e. g. JUnit teste.

TomcatJNDI tomcatJNDI = new TomcatJNDI();
tomcatJNDI.processContextXml(new File(“Tomcat-root-dir/conf/context.xml”);
tomcatJNDI.start();

Ensuite, vos classes peuvent consulter la source de données comme si elles étaient exécutées dans Tomcat.

Pour en savoir plus sur TomcatJNDI, rendez-vous ici: https://github.com/h-thurow/TomcatJNDI

3
Holger Thurow

Vous pouvez ajouter Tomcat lib via dépendance maven en utilisant ci-dessous, pour le faire fonctionner.

<dependency>
    <groupId>org.Apache.Tomcat</groupId>
    <artifactId>catalina</artifactId>
    <version>6.0.18</version>
    <scope>test</scope>
</dependency>
1
Ravindra S

Voulez-vous créer une source de données par programme sur Application Server? Référène:

  1. Créer une source de données JBoss 7 à partir du programme
  2. Créer une source de données Weblogic à partir du programme

Si vous avez déjà créé sur Sever,

public class YourTestCase {
    private Java.sql.Connection conn;

    @BeforeClass
    public static void init() {
        /* Weblogic */
        try {
            Context ctx = null;
            Hashtable ht = new Hashtable();
            ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
            ht.put(Context.PROVIDER_URL, "t3://<your-Host>:<your:post>");
            ctx = new InitialContext(ht);
            javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup ("<your-datasource-jndi-name>");
            conn = ds.getConnection();
        } catch(Exception e) {

        }
        /* JBoss 5*/
        Context.INITIAL_CONTEXT_FACTORY ---> org.jnp.interfaces.NamingContextFactory
        Context.PROVIDER_URL ---->http://localhost:1099
    }
    @AfterClass
    public static void finished() {
    }


    @Test
    public void testMethod() {
        try {
            Statement stmt = conn.createStatement();
            stmt.execute("select * from someTable");
            ResultSet rs = stmt.getResultSet();  
                // do operation
            stmt.close();
            conn.close();
            } catch (Exception e) {
                // a failure occurred
            } finally {
                try {ctx.close();
                } catch (Exception e) {
                }
            }
        }
    }
}
1
Zaw Than oo

Je pense que vous devriez essayer de simuler la base de données. Utilisez un cadre approprié, par exemple Mockito, il crée des simulacres et possède des capacités de DI.

0
alexsmail