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.
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);
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.
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
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>
Voulez-vous créer une source de données par programme sur Application Server? Référène:
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) {
}
}
}
}
}
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.