JUnit で JNDI DataSource を使う
サーバーサイドの場合、データベースのコネクションを取得するために DataSource を利用するのが一般的。JUnit を実行するときには、サーブレットコンテナなどは動作していないため、事前にJNDIの準備が必要。
JUnit JNDI DataSource helper package というものが昔からある。テスト目的なら十分な気もするが、いまいちな感じがして利用せず。
Tomcat の JNDI 実装を利用する方が良さそう。
- http://d.hatena.ne.jp/ellectra/20110719/1311040467
- https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit
上記の例は、データベースが Oracle だが、今回のサンプルでは PostgreSQL を使用している。
まだまだ、単体テスト作成になれてないところがあるが、ぼちぼち作成していこうと思う。
import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import junit.framework.TestCase; import org.postgresql.ds.PGSimpleDataSource; public class ConnectionTest extends TestCase { protected void setUp() { try { 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"); PGSimpleDataSource ds = new PGSimpleDataSource(); ds.setUser("dbuser"); ds.setPassword("dbpass"); ds.setDatabaseName("dbname"); ds.setServerName("localhost"); ds.setPortNumber(5432); ic.bind("java:comp/env/jdbc/database", ds); } catch (NamingException ex) { ex.printStackTrace(); } } public void testGetConnection() { try{ Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/database"); java.sql.Connection c = ds.getConnection(); assertNotNull(c); } catch (java.sql.SQLException se) { se.printStackTrace(); } catch (NamingException e) { e.printStackTrace(); } } }