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。对我来说,测试我的 DAOServiceLocator必须工作(来自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 添加到类路径(这是棘手的部分,您必须找到哪一个)。

此外,我可以看到您正在使用InitialContext非 arg 构造函数,因此您在应用程序服务器中运行时正在使用 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 回答
0

我很好奇您为什么要编写服务定位器。它是任务的一部分吗?在现实世界中,依赖注入显然是更好的选择,使用 Guice 或 Spring。

于 2009-11-09T21:56:00.523 回答