我正在尝试设置一些 jUnit 测试。我们的数据库是由服务器使用 JNDI 连接的。我们在 root.xml 中有一个描述设置的 xml。如何设置 jUnit 以连接到数据库?我更希望它只是从 root.xml 中读取内容,但无论如何我都愿意对其进行设置。
6 回答
我找到了这个博客: 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 库和 jar 才能使其正常工作
我发现最好的方法是使用一种叫做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("datasource",myDatasource);
多年来,我一直为此目的使用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 环境,但无需启动服务器。因此,您可以在例如 JUnit 测试中运行依赖于 Tomcat 的 JNDI 环境的类。
TomcatJNDI tomcatJNDI = new TomcatJNDI();
tomcatJNDI.processContextXml(new File(“tomcat-root-dir/conf/context.xml”);
tomcatJNDI.start();
然后,您的类可以像在 Tomcat 中运行时一样查找 DataSource。
更多关于 TomcatJNDI 的信息可以在这里找到:https ://github.com/h-thurow/TomcatJNDI
您想在 Application Server 上以编程方式创建数据源吗?参考:
如果您已经在服务器上创建,
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) {
}
}
}
}
}
您可以使用下面的 maven 依赖项添加 Tomcat 库,以使其正常工作。
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>catalina</artifactId>
<version>6.0.18</version>
<scope>test</scope>
</dependency>
我认为您应该尝试模拟数据库。使用适当的框架,例如 Mockito,它创建模拟并具有 DI 能力。