2009-11-09 140 views
0

这是对我的previous question的后续问题。使用JUnit测试ServiceLocator

我试图写测试用例我的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)。

我不知道如何处理错误消息。有没有人想提出一些我可以尝试的方法,希望能够奏效?

编辑:服务定位构造

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()); 
    } 
} 

回答

1

嗯,是com.iplanet.ias.admin.common.ASException上,当你调用你的测试类路径?

您是否依赖应用程序服务器将JDBC驱动程序的库存放在classpath中,还是自己部署它?

+0

我依靠应用程序服务器。因为应用程序服务器已经拥有了所有我想编写测试并与之相处的设置。 – Omnipresent 2009-11-09 02:27:36

+0

com.iplanet的东西似乎是Sun App Server的管理员属性。这可能需要从应用服务器获取JDBC资源。 ...但是应用服务器上未部署Junit测试... – Omnipresent 2009-11-09 02:31:08

+0

但是如果您的单元测试调用尝试加载JDBC驱动程序的代码,那么在执行单元测试时,JDBC驱动程序需要位于类路径中。 – 2009-11-09 03:41:54

2

实际上,错误很明显:java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASException表示在运行时找不到ASException的定义。

在应用程序服务器中运行时,此类由iPlanet Application Server提供,代码运行良好。要在应用程序服务器上下文之外运行此代码,您必须通过将其置于类路径中进行“手动”提供。所以你必须将正确的iPlanet JAR添加到类路径中(这是一个棘手的部分,你必须找到哪一个)。

此外,我可以看到您使用的是非参数构造函数InitialContext,因此您在应用程序服务器内运行时使用的是iPlanet的环境设置。在iPlanet之外(例如,对于单元测试),您必须自己为iPlanet提供正确的JNDI属性。为此,您必须在类路径中使用(至少)初始上下文工厂和提供程序URL来放置jndi.properties文件。例如:

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

检查您的iPlanet文档的值。

0

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

+0

不是不是一项任务。我们有旧的遗留代码仍在使用JDBC(与ORM相比)。我试图将这些遗留代码变得更加“真实世界值得”。你有任何你想分享的关于弹簧注射的链接? – Omnipresent 2009-11-09 23:32:48