Spring测试框架-JNDI资源



我在玩Spring测试框架,但我有一个问题。通常,当应用程序部署在Tomcat上时,我们有

<Resource
       name="jdbc/sqliteDS"
       auth="Container"
       type="javax.sql.DataSource"
       maxActive="4"
       maxIdle="2"
       username="x"
       maxWait="5000"
       driverClassName="org.sqlite.JDBC"
       password="x"
       url="jdbc:sqlite:/home/xxx/db.sqlite"/> 
</Context>

在Tomcat context.xml中,

<resource-ref>
    <description>sqlite DataSource</description>
    <res-ref-name>jdbc/sqliteDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

在web.xml和中

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

在datacontext.xml中用于获取数据源,但我如何模拟Spring测试框架的JNDI资源,因为现在在初始化过程中,我收到了找不到数据源的错误,他是对的。

此外,如果可以在不编写另一个.xml文件的情况下做到这一点,那就太好了。

不久前我不得不处理这个问题,但我没有找到合适的解决方案,而是找到了一个工作组,它意味着另一个xml文件:

首先创建一个Spring配置文件,定义JNDI信息(JNDI.xml):

<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@server:port:instance" />
    <property name="username" value="user" />
    <property name="password" value="pwd" />
  </bean>
</beans>

然后是一个静态类来绑定JNDI变量:

public class Initialize {
    public static void initializeJndi() throws Exception {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("jndi.xml");
        SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
        builder.bind("java:comp/env/jdbc/foo", applicationContext.getBean("dataSource"));
        builder.activate();
    }
}

然后在您的测试类中,添加以下内容:

    @BeforeClass
    public static void initJndi() throws Exception {
        Initialize.initializeJndi();
    }

这样,当您加载Spring主配置文件时,JNDI资源是可访问的。

也许这不是最好的方法,但它确实有效。

顺便说一句,拥有一个特定的配置文件似乎是个好主意,因为您可能不想在最终数据库上运行单元测试。这样做更多地被认为是集成测试,而不是单元测试。

希望有帮助,

Mouwah

最新更新