过去几天,我一直在为此苦苦挣扎。我正在尝试在容器外部测试DAO,但是在运行测试用例时出现错误:


  创建名称为bean的错误
  类中定义的“ SqlMapClient”
  路径资源
  [applicationContext.xml]:调用
  初始化方法失败;嵌套的
  例外是
  java.lang.NoClassDefFoundError:
  com / iplanet / ias / admin / common / ASException


我正在使用NB来运行测试。人们一直在说,我需要上述类位于测试用例的运行时类路径中。但是,我绝对找不到那个罐子实际上在哪里...?我已经将我的项目lib文件夹中的容器classpath + jars上的所有jars包含到了单元测试的运行时classpath中。仍然我得到同样的错误。

谷歌搜索此JAR也不起作用。

也许有人在那里知道从哪里可以买到那个怪胎罐。希望能解决我的问题。

最佳答案

这不能直接回答您的问题,但是我有两个建议。首先,既然我知道您正在使用Spring,我建议停止使用您自己的ServiceLocator来查找JNDI数据源,如您在先前的question中所提到的那样。相反,您应该为此使用Spring工具,然后将数据源注入到您的bean中。要获取JDNI数据源,请使用Spring的JndiObjectFactoryBean,如下所示:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>java:/comp/env/jdbc/myDS</value>
    </property>
</bean>


然后,在容器外运行时(通常在运行测试时),我的建议是不要使用JNDI数据源。相反,您应该使用Spring工具以另一种方式为DAO提供数据源(例如使用DriverManagerDataSource,在运行测试时不需要真正的连接池)。这样一来,您无需启动iPlanet就可以进行测试,而这对于测试是有意义的(并且您不想测试iPlanet的连接池,而是想测试DAO)。

因此,创建要在测试期间使用的applicationContext-test.xml,并使用其他配置进行数据访问。下面是DriverManagerDataSource的示例配置:

<bean id="dataSource"
         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="..."/>
    <property name="url" value="..."/>
    <property name="username" value="..."/>
    <property name="password" value="..."/>
</bean>


这实际上是推荐的方法(有关不同选项的更多详细信息,请参见Data access using JDBC章)。

PS:我不知道com/iplanet/ias/admin/common/ASException的来源,但这显然是iPlanet本身之一。如果您真的想查找,请搜索iPlanet安装的所有jar,尤其是其启动脚本中引用的jar。但我认为,那之后,您将面临JNDI问题。

09-25 20:35