テストに使えるかな
InitialContextの親玉を登録するコード。この登録は1度だけ行う。(2度目以降はエラーになる。)
親玉 = ココでは SimpleContext クラス。InitialContext への bind/unbind 操作は、この SimpleContext インスタンスへ転送されてくる。
static { try { NamingManager.setInitialContextFactoryBuilder(new InitialContextFactoryBuilder() { private InitialContextFactory initialContextFactory_ = new InitialContextFactory() { private Context context = new SimpleContext(); public Context getInitialContext(Hashtable env) throws NamingException { return context; } }; public InitialContextFactory createInitialContextFactory(Hashtable env) throws NamingException { return initialContextFactory_; } }); } catch (NamingException e) { throw new RuntimeException(e); } }
SimpleContext はこんな感じの簡単実装。
public class SimpleContext implements Context { private Hashtable env_ = new Hashtable(); private Map values_ = new HashMap(); public void close() throws NamingException { synchronized (values_) { values_ = new HashMap(); } } public void unbind(String name) throws NamingException { synchronized (values_) { values_.remove(name); } } public Hashtable getEnvironment() throws NamingException { return env_; } public void unbind(Name name) throws NamingException { synchronized (values_) { values_.remove(name.toString()); } } public Object lookup(String name) throws NamingException { Object o = null; synchronized (values_) { o = values_.get(name); } if (o == null) { throw new NamingException("[" + name + "]はバインドされていません"); } return o; } public Object removeFromEnvironment(String propName) throws NamingException { return env_.remove(propName); } public void bind(String name, Object obj) throws NamingException { synchronized (values_) { values_.put(name, obj); } } public void bind(Name name, Object obj) throws NamingException { synchronized (values_) { values_.put(name.toString(), obj); } } public Object addToEnvironment(String propName, Object propVal) throws NamingException { return env_.put(propName, propVal); } // 以下略
テスト対象コードが InitialContext#lookup で取得するオブジェクトを、予めテストコードで InitilaContext#bind しておく。
# テストではモックを登録(bind)しておく。
# JNDIを使う場合のモック差し込みってこんな感じかな。