首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将DataSource绑定到InitialContext以进行JUnit测试?

如何将DataSource绑定到InitialContext以进行JUnit测试?
EN

Stack Overflow用户
提问于 2010-08-11 17:49:55
回答 2查看 50.7K关注 0票数 16

我试图在数据库"worker“类上运行JUnit测试,这些类在InitialContext上执行jndi查找以获得DataSource。工作类通常运行在具有适当定义的v3资源的Glassfish jdbc上。

当部署在App上时,代码运行得很好,但没有在JUnit测试环境中运行,因为很明显,它找不到jndi资源。因此,我尝试在测试类中设置一个InitialContext,该测试类将数据源绑定到适当的上下文,但它不起作用。

下面是我在测试中的代码

代码语言:javascript
运行
复制
@BeforeClass
public static void setUpClass() throws Exception {
    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");

        // Construct DataSource
        SQLServerConnectionPoolDataSource testDS = new SQLServerConnectionPoolDataSource();
        testDS.setServerName("sqlserveraddress");
        testDS.setPortNumber(1433);
        testDS.setDatabaseName("dbname");
        testDS.setUser("username");
        testDS.setPassword("password");

        ic.bind("java:/comp/env/jdbc/TestDS", testDS);

        DataWorker dw = DataWorker.getInstance();
    } catch (NamingException ex) {
        Logger.getLogger(TitleTest.class.getName()).log(Level.SEVERE, null, ex);
    }
}

然后,DataWorker类有一个具有以下代码的方法,大致如下

代码语言:javascript
运行
复制
InitialContext ic = null;
DataSource ds = null;
Connection c = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "SELECT column FROM table";
try{
    ic = new InitialContext();
    ds = (DataSource) ic.lookup("jdbc/TestDS");
    c = ds.getConnection();
    ps = c.prepareStatement(sql);
    // Setup the Prepared Statement
    rs = ps.executeQuery();
    if(rs.next){
        //Process Results
    }
}catch(NamingException e){
    throw new RuntimeException(e);
}finally{
    //Close the ResultSet, PreparedStatement, Connection, InitialContext
}

如果我更改

ic.createSubContext("java:/comp/env/jdbc");

ic.bind("java:/comp/env/jdbc/TestDS",testDS)

行到

ic.createSubContext("jdbc");

ic.bind("jdbc/TestDS",testDS);

worker类能够找到DataSource,但是如果说“用户名登录到服务器失败”,则会出现错误。

如果我将我在JUnit方法中创建的JUnit直接传递给工作人员,它可以连接并运行查询。

因此,我想知道如何绑定一个可以由工作类查找的,而不需要在worker中查找。

EN

回答 2

Stack Overflow用户

发布于 2010-08-12 17:12:57

几年前,当我最后一次尝试这样的东西时,我终于放弃并重构了:此时,您无法在容器之外创建一个DataSource。也许你可以,现在,也许有人在嘲弄什么。

不过,闻起来..。您不应该有任何直接依赖于DataSources或JNDI查找的“业务逻辑”代码。这都是管道连接在代码之外的。

你的设计有多灵活?如果被测试的代码直接依赖于DataSource (甚至获得它自己的连接),那么重构它。注入一个连接将允许您使用普通的旧JDBC测试所有您喜欢的东西,甚至使用内存中的实现,并且避免了您不得不支持大量不必要的(无论如何,测试)基础结构来实现它。

票数 1
EN

Stack Overflow用户

发布于 2016-01-03 16:09:02

我发现这个例子也是错误的。这对我有用。

代码语言:javascript
运行
复制
ic.createSubcontext("java:comp");
ic.createSubcontext("java:comp/env");
ic.createSubcontext("java:comp/env/jdbc");

final PGSimpleDataSource ds = new PGSimpleDataSource();
ds.setUrl("jdbc:postgresql://localhost:5432/mydb");
ds.setUser("postgres");
ds.setPassword("pg");

ic.bind("java:comp/env/jdbc/mydb", ds);

您会注意到,在每个上下文中,'/‘后面的'java:’都是错误的,不应该存在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3461310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档