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/