- PR -

JBoss+Spring+JUnitでユニットテスト時、JNDIのDataSource名が参照できない

1
投稿者投稿内容
まほ
常連さん
会議室デビュー日: 2004/07/30
投稿数: 23
投稿日時: 2005-07-22 21:48
お世話になります。
WebLogicで稼動中のシステムをJBossへ移行したいと考えています。

JNDIやDataSourceなどの設定と一部ソース改修を行い、システムはJBoss上で稼動する状態になりました。
ところがEclipse上からユニットテストを実行すると、テストクラス起動時にjavax.naming.NameNotFoundExceptionが発生します。どうもJNDIに設定したDataSource名を参照できていないようです。DataSourceはJNDIの java: 名前空間に登録しているのですが、これはリモートからは参照できないものなのでしょうか?

ちなみにDataSource名がJNDIのjava:名前空間に登録されていることは jmx-consoleで確認済みです。

■applicationContext.xmlの抜粋
<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>java:/myDataSource</value></property>
</bean>

■*-ds.xml の抜粋
<datasources>
<local-tx-datasource>
<jndi-name>myDataSource</jndi-name>
<connection-url>jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:sidxxx</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>user</user-name>
<password>pass</password>
</local-tx-datasource>
</datasources>

■環境
JBoss3.2.7
Spring1.1
Struts1.1
Eclipse2.1.3
JUnit1.1
以上をWindowsXP SP2の同一マシン上で検証。

試しに、global名前空間にいるJNDI名(XAConnectionFactoryなど)を指定してみると、NameNotFoundException ではなく org.springframework.beans.TypeMismatchException に変化しましたので、global名前空間であれば参照可能な状態だと思います。


またここの過去ログにちょっと似た事例
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17003&forum=12&5
があったので、それを参考に
JUnit JNDI DataSource helper package
http://www.junit.org/news/extension/index.htm#JNDI
を使用し JNDIを参照しない方法も試してみました。
このJNDI DataSource helperの導入にあたっての変更点は以下の通りです。
・jrunittesthelper.jarを lib/ にコピー。
・同 lib/ に jndi_unit_test_helper.properties を作成。
・.classpathにjrunittesthelper.jarを追加。
・テストクラスのコンストラクタにJNDIUnitTestHelper.init()呼び出し追加。

しかしテスト実行すると
java.lang.UnsupportedOperationException: Method close() not yet implemented.
が発生してしまいました。


JBoss+Spring、Eclipse+JUnitという、私が思うに珍しくないだろう組み合わせなのに、Web上にはなかなか有用な情報が見当たりません。皆様はどのようにユニットテストされているのでしょうか?


・単にJNDI設定ミスであり、java: 名前空間も参照できる?
・DataSourceをglobalに登録する? (書式が分からない)
・JUnit JNDI DataSource helper を正しく使うべき?


どう対処すべきでしょうか? 宜しくお願いいたします。
まほ
常連さん
会議室デビュー日: 2004/07/30
投稿数: 23
投稿日時: 2005-07-29 10:57
自己レスです。

結局解決策が見つからず、結果的にapplicationContext.xmlを稼動時用とユニットテスト用の2通り用意する方法をとることになりました。

まずJUnit JNDI DataSource helper は一部メソッド未実装のためSpring環境での使用は難しいと結論付けました。
そしてJBossのDataSourceについても、使用しているバージョン3.2.7では外部(別VM)から参照できないようです。ズバリ明確な情報があった訳ではないですが、web上の情報を総合してそう判断できました。ちなみにJBoss4.0.xだとDataSource定義(*-ds.xml)の<local-tx-datasource>内に
<use-java-context>false</use-java-context>
と書くことで外部から参照できるようですが、その場合にメモリリークらしき現象が起こる場合があるようなので(http://www.freeml.com/message/jboss-fan@freeml.com/0002393)、これも使用しないことにしました。


やっぱり公式ドキュメントを購入すべきかなと思いました。しかし公式ドキュメントの質はどうなんだろう。良いとも悪いとも、さっぱり評判を聞きませんね・・・。
まほ
常連さん
会議室デビュー日: 2004/07/30
投稿数: 23
投稿日時: 2005-07-29 11:04
補足です。

引用:

まほさんの書き込み (2005-07-29 10:57) より:
結局解決策が見つからず、結果的にapplicationContext.xmlを稼動時用とユニットテスト用の2通り用意する方法をとることになりました。



具体的には、ユニットテスト時はDataSourceをJNDIから取得せず、applicationContext.xml中にDataSourceの記述をベタ書きする方向です。
これもまだ完璧に検証したわけではありませんが。

とりあえず報告しておきます。
1

スキルアップ/キャリアアップ(JOB@IT)