And*_*dna 8 spring jndi spring-test
我正在玩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>
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
在web.xml和
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:/comp/env/jdbc/sqliteDS" />
</bean>
Run Code Online (Sandbox Code Playgroud)
在data-context.xml中获取数据源,但我怎样才能为Spring测试框架模拟JNDI资源,因为现在在初始化过程中我遇到的错误是找不到数据源,而且他是对的.
此外,如果可以在不编写另一个.xml文件的情况下执行此操作,那将会很棒.
小智 9
我不久前必须处理这个问题,我没有找到合适的解决方案,而是一个暗示另一个xml文件的workaroud:
首先,创建一个定义JNDI信息的Spring配置文件(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>
Run Code Online (Sandbox Code Playgroud)
然后是一个绑定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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您的测试类中添加以下内容:
@BeforeClass
public static void initJndi() throws Exception {
Initialize.initializeJndi();
}
Run Code Online (Sandbox Code Playgroud)
因此,当您加载Spring主配置文件时,可以访问JNDI资源.
也许这不是最好的方法,但它确实有效.
顺便说一下,拥有一个特定的配置文件似乎是个好主意,因为您可能不想在最终数据库上运行单元测试.这样做更像是集成测试,而不是单元测试.
希望能帮助到你,
Mouwah
| 归档时间: |
|
| 查看次数: |
7900 次 |
| 最近记录: |