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)

dataSourcebean的定义很简单:

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

即使单元测试在应用程序容器之外运行,如何让 Spring 正确连接到 WebSphere JNDI?

4

1 回答 1

1

虽然没有连接到 WebSphere 实例,但在查看 JNDI 资源时,您始终可以SimpleNamingContextBuilderorg.springframework.mock.jndi包中使用。这允许您构建一个对象(例如一个直接绑定到远程 JNDI 服务的 DataSource),然后将其绑定到一个“模拟”JNDI 服务,以便在测试时注入 Spring 应用程序上下文。

为此,您需要在 JUnit 测试的 @BeforeClass(静态)中执行此操作,以确保在 App 上下文启动之前JNDI 绑定可用。(所以 App 上下文在查找 jdbc/dataSource 时可以找到一些东西)

如果您要在持续集成环境中使用它,我不建议您连接另一台服务器,但如果您只想进行“一次性手动测试”,您可以尝试以下操作;

@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 回答