gpt4 book ai didi

junit - 使用 JUnit 时可以避免重新定义 JNDI 数据源吗?

转载 作者:行者123 更新时间:2023-12-02 11:22:26 25 4
gpt4 key购买 nike

我的 Java EE 7 应用程序使用 Spring,在 Tomcat 7 上运行。它使用 JNDI 数据源访问数据库,该数据源由 context.xml 中的这一行定义:

<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 Test),发生了异常:
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 ——我找到了解决办法。我将此添加到我的测试类中:
@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 中,一次在我的测试类中。我被迫将我的数据库密码存储在将要 checkin 源代码控制的 Java 代码中。

我也已经咨询过这篇文章: Setting up JNDI Datasource in jUnit

有没有更好的办法?

最佳答案

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

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

关于junit - 使用 JUnit 时可以避免重新定义 JNDI 数据源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20643898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com