0

WebSphere で定義された JDBC リソースに依存する他のクラスを参照するクラスを参照する単体テストをいくつか作成しました。問題の単体テストは実際にはデータベースの読み取りまたは書き込みをトリガーしませんが、それらが参照するクラスは Spring によって作成され、Spring 構成ファイルはそれらに JDBC リソースを注入しようとします。Spring が失敗し、次のエラー メッセージが表示されます。

2013-07-31 13:46:17,008: アプリケーション コンテキストを読み込めませんでした
org.springframework.beans.factory.BeanCreationException: クラスパス リソース [myApplication.xml] で定義された名前 'dataSource' を持つ Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は javax.naming.ServiceUnavailableException: 通信障害のため、初期コンテキストを取得できませんでした。プロバイダー URL が指定されていないため、"corbaloc:iiop:1.0@myMachineName.myCompany.com:2809/NameService" の既定のプロバイダー URL が使用されました。URL のブートストラップ アドレス情報が正しいこと、およびターゲット ネーム サーバーが実行中であることを確認してください。不正なブートストラップ アドレスまたは使用できないネーム サーバー以外の考えられる原因には、ネットワーク環境およびワークステーション ネットワーク構成が含まれます。[ルート例外は org.omg.CORBA.TRANSIENT: java.net.ConnectException: 接続が拒否されました: 接続:
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338) で
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) で
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) で
    java.security.AccessController.doPrivileged(AccessController.java:224) で
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) で

Beanの定義dataSourceは単純です。

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/dataSource" />
</bean>

単体テストがアプリケーション コンテナーの外部で実行されている場合でも、Spring を WebSphere JNDI に正しく接続するにはどうすればよいですか?

4

1 に答える 1

1

WebSphere インスタンスに接続していませんが、JNDI リソースを見ると、パッケージSimpleNamingContextBuilderからいつでも使用できます。org.springframework.mock.jndiこれにより、オブジェクト (リモート JNDI サービスへの独自の直接バインディングを持つ DataSource など) を構築し、それを「モック」JNDI サービスにバインドして、テスト時に Spring Application Context に注入することができます。

これを行うには、JUnit テストの @BeforeClass (静的) で実行して、App コンテキストが起動する前にJNDI バインディングが使用可能であることを確認する必要があります。(そのため、App コンテキストは jdbc/dataSource を検索するときに何かを見つけることができます)

これを継続的インテグレーション環境で使用する場合は、別のサーバーに接続することはお勧めしませんが、「1 回限りの手動テスト」だけを行う場合は、次のようなことを試すことができます。

@BeforeClass
public static void beforeClass() throws Exception {

    Properties properties = new Properties();
    //build your properties to the remove class
    Context context = new InitialContext(properties);
    //look up your dataSource
    DataSource ds = (DataSource) context.lookup("");
    //now build the simple
    SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
    builder.bind("jdbc/dataSource", ds);

}
于 2013-07-31T19:59:57.043 に答える