在jUnit中设置JNDI数据源

时间:2012-09-22 15:32:53

标签: java junit jndi

我正在尝试设置一些jUnit测试。我们的数据库由服务器使用JNDI连接。我们有一个xml描述了root.xml中的设置。如何设置jUnit以连接数据库?我宁愿让它只读取root.xml中的内容,但我仍然可以设置它,无论如何都可行。

6 个答案:

答案 0 :(得分:14)

我找到了这个博客: https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit

关于H2数据源: http://www.h2database.com/javadoc/org/h2/jdbcx/JdbcConnectionPool.html

所以我的代码:

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


    }

}

注意:我必须在Tomcat的bin目录中添加Tomcat Library和jar才能使其正常工作

答案 1 :(得分:9)

我发现最好的方法是使用名为Simple-Jndi的东西。

我将此添加到maven文件中:

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

您可以在此下载该软件包,下载包含说明手册。 http://code.google.com/p/osjava/downloads/detail?name=simple-jndi-0.11.4.1.zip&can=2&q=

添加到项目后,您只需按照说明添加几个属性文件。

但是,在添加依赖项之后,我相信您可以以编程方式添加jndi资源,而不是使用属性文件。你做这样的事情:( new InitialContext())。rebind(&#34; datasource&#34;,myDatasource);

答案 2 :(得分:3)

我已经将 Simple-JNDI 用于此目的多年了。它为您提供了JNDI服务的内存实现,并允许您使用属性文件中定义的对象填充JNDI环境。还支持加载文件中配置的数据源或连接池。

要获取连接池,您必须创建如下文件:

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

在您的应用程序中,您可以通过

访问游泳池
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("path/to/your/connectionPool");

您可以在https://github.com/h-thurow/Simple-JNDI找到更多相关信息。

TomcatJNDI 也有助于解决这种情况。它可以处理Tomcat的配置文件并创建与Tomcat相同的JNDI环境,但无需启动服务器。因此,您可以在e中运行具有依赖于Tomcat的JNDI环境的类。 G。 JUnit测试。

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

然后,您的类可以查找DataSource,就像它们在Tomcat中运行一样。

有关TomcatJNDI的更多信息,请访问:https://github.com/h-thurow/TomcatJNDI

答案 3 :(得分:1)

您是否希望在Application Server上以编程方式创建数据源? Referene:

  1. Create Datasource JBoss 7 from program
  2. Create Datasource Weblogic from program
  3. 如果您已在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) {
                    }
                }
            }
        }
    }
    

答案 4 :(得分:1)

您可以使用下面的maven依赖项添加Tomcat lib,以使其正常工作。

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>catalina</artifactId>
    <version>6.0.18</version>
    <scope>test</scope>
</dependency>

答案 5 :(得分:0)

我认为您应该尝试模拟数据库。使用适当的框架,例如Mockito,它会创建模拟并具有DI功能。