JNDI lookupを単体テストする方法

JNDIをJ2EEサーバ無しでかつテスト用ライブラリも無しでテストする場合、InitialContextに自前でbindしてlookupします。
@BeforeClassだったり、setUpメソッドで以下のようにbindすると良いでしょう。
この例では、T2でCDI単体テストを行う時に利用しています。

System.out.println("CdiTestCase#setUp");
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
    "org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES,
    "org.jboss.weld.resources.ManagerObjectFactory");

ic = new InitialContext();
ic.createSubcontext("java:");
ic.createSubcontext("java:comp");
ic.createSubcontext("java:comp/env");

weld = new Weld();
WeldContainer weldContainer = weld.initialize();
BeanManager beanManager = weldContainer.getBeanManager();

ic.bind("java:comp/env/BeanManager", beanManager);

これで、以下のように取得可能になります。

BeanManager beanManager = InitilaContext.doLookup("java:comp/env/BeanManager");


DataSourceをlookupして取得するような単体テストJUnitで行う場合も有効です。

OracleDataSource ods = new OracleDataSource();
ods.setDriverType("oci");
ods.setServerName("dlsun999");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName("816");
ods.setPortNumber(1521);
ods.setUser("scott");
ods.setPassword("tiger");

Context ctx = new InitialContext();
ctx.bind("jdbc/sampledb", ods);


テストには、tomcatのnaming-java, naming-factory, naming-resourceが必要です。

  <dependency>
    <groupId>tomcat</groupId>
    <artifactId>naming-java</artifactId>
    <version>5.0.28</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>tomcat</groupId>
    <artifactId>naming-factory</artifactId>
    <version>5.5.23</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>tomcat</groupId>
    <artifactId>naming-resources</artifactId>
    <version>5.5.23</version>
    <scope>test</scope>
  </dependency>

まとめ

これで単体テストでlookupし放題ですね。
CDIを勉強したいならid:koichikさんのJUnitCDIを見ると良いですよ!
http://junitcdi.sandbox.seasar.org/