Configuración de JNDI Datasource en jUnit

Estoy tratando de configurar algunas pruebas jUnit. Nuestra base de datos está conectada por el servidor usando JNDI. Tenemos un xml que describe la configuración en root.xml. ¿Cómo configuro jUnit para conectarme a la base de datos? Preferiría que acabara de leer las cosas de root.xml, pero estoy dispuesto a configurarlo de todos modos que funcione.

Encontré este Blog: https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit

Acerca de H2 Datasource: http://www.h2database.com/javadoc/org/h2/jdbcx/JdbcConnectionPool.html

Entonces para mi Código:

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")); } } } 

Nota : Tuve que agregar la Biblioteca Tomcat y los flasks dentro del directorio bin de Tomcat para que funcione

Descubrí que la mejor manera de hacerlo es usar algo llamado Simple-Jndi .

Agregué esto al archivo maven:

   simple-jndi simple-jndi 0.11.4.1 test  

Puede descargar el paquete aquí, la descarga contiene un manual de instrucciones. http://code.google.com/p/osjava/downloads/detail?name=simple-jndi-0.11.4.1.zip&can=2&q=

Después de agregar a su proyecto, solo tiene que agregar un par de archivos de propiedades, según las instrucciones.

Sin embargo, después de agregar la dependencia, creo que puede agregar sus recursos jndi mediante progtwigción en lugar de usar archivos de propiedades. Haga algo como esto: (new InitialContext ()). Rebind (“datasource”, myDatasource);

He usado Simple-JNDI para este propósito desde hace años. Le proporciona una implementación en memoria de un servicio JNDI y le permite poblar el entorno JNDI con objetos definidos en archivos de propiedades. También se admite la carga de fonts de datos o grupos de conexiones configurados en un archivo.

Para obtener un grupo de conexiones, debe crear un archivo como este:

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

En su aplicación, puede acceder al grupo a través de

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

Puede encontrar más información al respecto en https://github.com/h-thurow/Simple-JNDI .

TomcatJNDI también ayuda con esa situación. Puede procesar los archivos de configuración de Tomcat y crea el mismo entorno JNDI que Tomcat, pero sin iniciar un servidor. Entonces puede ejecutar clases con dependencias en el entorno JNDI de Tomcat en, por ejemplo, pruebas JUnit.

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

Entonces sus clases pueden buscar DataSource como cuando se ejecutarían en Tomcat.

Puede encontrar más información sobre TomcatJNDI aquí: https://github.com/h-thurow/TomcatJNDI

¿Le gustaría crear un origen de datos programáticamente en Application Server? Referene:

  1. Crear Datasource JBoss 7 del progtwig
  2. Crear Datasource Weblogic del progtwig

Si ya creó en 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://:"); ctx = new InitialContext(ht); javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup (""); 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) { } } } } } 

Puede agregar Tomcat lib a través de la dependencia maven usando debajo, para que funcione.

  org.apache.tomcat catalina 6.0.18 test  

Creo que deberías tratar de burlar la base de datos. Use el marco apropiado, por ejemplo Mockito, crea burlas y tiene habilidades DI.