0

これは私の前の質問へのフォローアップの質問です。

ServiceLocator クラスのテスト ケースを作成しようとしていますが、次のエラーが表示されます。

com/iplanet/ias/admin/common/ASException
java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASException
        at java.lang.ClassLoader.defineClass1(Native Method)

私のテストケース:

public void testServiceLocator () throws UivException, NamingException
{
    DataSource ds = ServiceLocator.getInstance().getDataSource("jdbc/RSRC/my/mydb");
    //I have not put any assert statements because i know above line is failing
}

上記のコードは、getInstance()次のようなメソッドで失敗します。

static public ServiceLocator getInstance() throws UivException {
    try {
        if (me == null) {
          synchronized(ServiceLocator.class) {
            me = new ServiceLocator();
          }
        }
        return me;
    }
    catch (UivException e) {
          throw new UivException(ErrorCode.SERVICE_LOCATOR_ERROR,
                                 ErrorCode.SERVICE_LOCATOR_LOOKUP_ERROR,
                                 e.getMessage());
    }
}

ServiceLocatorフロントエンドからアプリケーションをテストしても問題がないため、これがうまく機能することはわかっています。このテスト ケースを書いている唯一の理由は、DAOをテストしたいからです。そして、私が DAO をテストするには、 ServiceLocator( JUnitから) 動作する必要があります。

エラーメッセージの意味がわかりません。誰かが私が試してうまくいくことを提案したいですか?

編集: ServiceLocator コンストラクター

private ServiceLocator() throws UivException  {
    try {
        ic = new InitialContext();
        // System.out.println("Created the Initial Context");
        cache = Collections.synchronizedMap(new HashMap());
    }
    catch (NamingException ne) {
        throw new UivException(ErrorCode.SERVICE_LOCATOR_ERROR,
                               0, ne.getMessage());
    }
    catch (NullPointerException e) {
          throw new UivException(ErrorCode.SERVICE_LOCATOR_ERROR,
                                 0, e.getMessage());
    }
}
4

3 に答える 3

2

実際、エラーは非常に明確です。実行時java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASExceptionに の定義ASExceptionが見つからないことを示しています。

アプリケーション サーバーで実行する場合、このクラスは iPlanet Application Server によって提供され、コードは正常に実行されます。このコードをアプリケーション サーバーのコンテキスト外で実行するには、クラスパスに配置して「手動で」提供する必要があります。そのため、適切な iPlanet JAR をクラスパスに追加する必要があります (これはトリッキーな部分です。どの JAR かを見つける必要があります)。

InitialContextさらに、非引数コンストラクターを使用しているため、アプリケーション サーバー内で実行するときに iPlanet の環境設定を使用していることがわかります。iPlanet の外部 (単体テストなど) では、iPlanet に適切な JNDI プロパティを自分で提供する必要があります。そのためには、jndi.properties(少なくとも) 初期コンテキスト ファクトリとプロバイダー URL を含むファイルをクラスパスに配置する必要があります。このようなもの:

java.naming.factory.initial=...
java.naming.provider.url=...

値については、iPlanet のドキュメントを確認してください。

于 2009-11-09T06:00:51.743 に答える
1

com.iplanet.ias.admin.common.ASExceptionテストを呼び出すとき、クラスパス上にありますか?

クラスパスにJDBCドライバーのライブラリを含めるためにアプリサーバーに依存していますか、それとも自分でデプロイしていますか?

于 2009-11-09T02:08:41.650 に答える