私はいくつかのjUnitテストを設定しようとしています。私たちのデータベースは、JNDIを使用してサーバーによって接続されています。 root.xmlにセットアップを記述するxmlがあります。データベースに接続するようにjUnitを設定するにはどうすればよいですか?私はそれがroot.xmlからのものを読み取るだけにしたいのですが、とにかくそれが機能するように設定することはできます。
そのための最善の方法は、 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);
私はこのブログを見つけました: 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を使用しています。これにより、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();
その後、Tomcatで実行するときと同じように、クラスでDataSourceをルックアップできます。
TomcatJNDIの詳細については、こちらをご覧ください。 https://github.com/h-thurow/TomcatJNDI
以下を使用して、Maven依存関係を介してTomcat libを追加し、機能させることができます。
<dependency>
<groupId>org.Apache.Tomcat</groupId>
<artifactId>catalina</artifactId>
<version>6.0.18</version>
<scope>test</scope>
</dependency>
アプリケーションサーバーでプログラムによってデータソースを作成しますか?レフェン:
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) {
}
}
}
}
}
データベースをモックアウトしてみるべきだと思います。 Mockitoなどの適切なフレームワークを使用します。モックを作成し、DI機能を備えています。