先日仕事で、JNDIルックアップを行うライブラリを作りました。
コードの内容を単純化すれば、おなじみの以下のようなものです。
Context ctx = new InitialContext(); Object target = ctx.lookup("JNDI名");
コンテキストは通常J2EEサーバが管理しているので、これをサーバ上で使用する分には問題ありません。
しかし、単体テストコードを書く場合には一工夫必要になります。
直感的に思い浮かぶのは以下のようなコードですが・・・
// ★失敗例 // 前処理 Context ctx = new InitialContext(); ctx.bind("JNDI名", obj); // ライブラリ呼び出し
これだと、InitialContextの生成時に例外がスローされてしまいます。
それではどうすれば初期化できるのかと調べた結果、catalinaを使用した場合のサンプルを載せてくれている素敵なブログを見つけました。
http://blogs.sun.com/randystuph/entry/injecting_jndi_datasources_for_junit
上記のブログにしたがったサンプルコードを掲載しておきます。
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory"); System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming"); Context ctx = new InitialContext(); ctx .createSubcontext("java:"); ctx .createSubcontext("java:/comp"); ctx .createSubcontext("java:/comp/env"); ctx .createSubcontext("java:/comp/env/jdbc"); ctx .bind("java:/comp/env/jdbc/nameOfObject", obj);