首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用JUnit时,我可以避免重新定义JNDI数据源吗?

在使用JUnit时,我可以避免重新定义JNDI数据源吗?
EN

Stack Overflow用户
提问于 2013-12-18 04:21:20
回答 2查看 2.1K关注 0票数 7

我的JavaEE7应用程序使用Spring,运行在Tomcat7上。它通过使用context.xml中的以下行定义的JNDI数据源来访问数据库:

代码语言:javascript
运行
复制
<Resource auth="Container" driverClassName="org.postgresql.Driver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/leadmanager" password="xxxxxxxx" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/leadmanager" username="postgres"/>

我创建了一些JUnit测试。当我尝试运行它们(在Eclipse中,右键单击测试类并选择run As | JUnit测试)时,发生了异常:

代码语言:javascript
运行
复制
javax.persistence.PersistenceException: [PersistenceUnit: leadmanager] Unable to build EntityManagerFactory
...
Caused by: org.hibernate.service.jndi.JndiException: Error parsing JNDI name [java:/comp/env/jdbc/leadmanager]
...
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
...

多亏了这篇有用的帖子-- https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit --我找到了一个解决方案。我将这个添加到我的测试类中:

代码语言:javascript
运行
复制
@BeforeClass
public static void setUpClass() throws Exception {

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

    PGPoolingDataSource ds = new PGPoolingDataSource();
    ds.setServerName("localhost:5432/leadmanager");
    ds.setUser("postgres");
    ds.setPassword("xxxxxxxx");
    ic.bind("java:/comp/env/jdbc/leadmanager", ds);
}

但这太可怕了!我不得不定义我的数据源两次,一次在context.xml中,另一次在我的测试类中。我不得不用Java代码存储我的数据库密码,这些代码将被签入到源代码控制中。

我也参考过这篇文章:Setting up JNDI Datasource in jUnit

有没有更好的方法?

EN

回答 2

Stack Overflow用户

发布于 2015-11-02 20:41:35

原因是您的测试不是在tomcat中运行,而是在单独的JVM实例中运行。

尝试使用Arquillian构建您的单元测试-此工具会将您的测试打包为一个简单的web应用程序,并在tomcat中执行。其结果是,在tomcat中可以访问的所有内容在测试中都可以访问,包括资源。

票数 0
EN

Stack Overflow用户

发布于 2017-10-28 19:31:03

您也可以使用TomcatJNDI。它读取Tomcat的配置文件并创建一个JNDI环境,就像在web应用程序中一样。它和下面的代码示例一样简单:

代码语言:javascript
运行
复制
TomcatJNDI tomcatJNDI = new TomcatJNDI();
tomcatJNDI.processContextXml(contextXmlFile);
tomcatJNDI.start();

现在,您可以访问在Tomcat的配置文件中声明的所有资源。

Find out more about it here.

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

https://stackoverflow.com/questions/20643898

复制
相关文章

相似问题

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