JUnit で JNDI DataSource を使う

サーバーサイドの場合、データベースのコネクションを取得するために DataSource を利用するのが一般的。JUnit を実行するときには、サーブレットコンテナなどは動作していないため、事前にJNDIの準備が必要。

JUnit JNDI DataSource helper package というものが昔からある。テスト目的なら十分な気もするが、いまいちな感じがして利用せず。

Tomcat の JNDI 実装を利用する方が良さそう。

上記の例は、データベースが 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();
        }
    }
}