TomcatのJNDIは外部からアクセスできなくて困った時

Tomcatに設定されているデータソースをJavaアプリケーション(具体的にはJUnit)から参照したかったのですが、デフォルトではできないという事で、JNDIUnitTestHelperというのを発見しました。

http://www.junit.org/news/extension/index.htm#JNDI

JNDIUnitTestHelper付属のjndi_unit_test_helper.propertiesをコピーして(WEB-INF/にコピーした)内容を変更します。(私の場合Oracle)

com.javaranch.unittest.helper.sql.pool.JNDIName=java:comp/env/jdbc/test
com.javaranch.unittest.helper.sql.pool.dbDriver=oracle.jdbc.driver.OracleDriver
com.javaranch.unittest.helper.sql.pool.dbServer=jdbc:oracle:thin:@serverName:1521:SERVICE_NAME
com.javaranch.unittest.helper.sql.pool.dbLogin=dbUserName
com.javaranch.unittest.helper.sql.pool.dbPassword=dbPassword

そしてJUnitのsetUp()メソッドで初期化処理

protected void setUp() throws Exception {
    if(JNDIUnitTestHelper.notInitialized()){ 
        JNDIUnitTestHelper.init("WEB-INF/jndi_unit_test_helper.properties"); 
    }
}

後はアプリケーション側で以下のように記述してあればデータソースが取得できます。

DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/test");

実際のJNDINameと合わせておけば、WEBアプリケーションとして動作させる時と、JUnit(or 単体)で動作させる時とで同じソースで実行できるのでとても助かりました。