如何使用 Spring 测试模拟的 JNDI 数据源? [英] How to test a mocked JNDI datasource with Spring?
问题描述
我对 Spring 相当陌生,想知道如何创建使用模拟数据源的 JUnit 测试以及如何使用 JNDI 上下文?目前,我的应用程序使用来自 tomcat 的 JNDI 上下文来检索连接,并通过该连接从数据库中检索数据.所以我想我需要模拟 JNDI 调用和数据检索.关于解决这个问题的最佳方法的任何好的指示都会很棒!非常感谢!
I am fairly new to Spring and wondering how to create JUnit tests that use a mocked datasource and how to use a JNDI context with that? Currently my application uses a JNDI context from tomcat to retrieve a connection and via that connection retrieves data from a database. So I guess I need to mock the JNDI calls and the data retrieval. Any good pointers on what the best way to tackle this would be great! Thanks a lot!
推荐答案
我通常在单独的文件中定义我的 JNDI 依赖项,例如 datasource-context.xml
:
I usually define my JNDI dependencies in seperate file, like datasource-context.xml
:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
<jee:jndi-lookup id="dataSource"
jndi-name="java:comp/env/dataSource"
expected-type="javax.sql.DataSource" />
</beans>
这样我就可以在测试资源中创建另一个文件并定义适合我的测试数据源,例如 datasource-testcontext.xml
:
So that in test resources I can create another file and define the test datasource however it suits me, like datasource-testcontext.xml
:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="org.hsqldb.jdbcDriver"
p:url="jdbc:hsqldb:hsql://localhost:9001"
p:username="sa"
p:password="" />
</beans>
然后在我的测试类中,我使用数据源的测试配置而不是依赖 JNDI 的生产配置:
And then in my test class I use the test configuration of the datasource instead of production one that depends on JNDI:
@ContextConfiguration({
"classpath*:META-INF/spring/datasource-testcontext.xml",
"classpath*:META-INF/spring/session-factory-context.xml"
})
public class MyTest {
}
如果数据源未在单独的文件中定义,您仍然可以轻松地存根 JNDI 调用返回的对象:
If the data source is not defined in a separate file You can still stub the object returned by JNDI calls easily:
- 像这样:在容器外为 JUnit 测试注入 JNDI 数据源
- 或使用
org.springframework.mock.jndi
包中的类,即.SimpleNamingContextBuilder
(这个类的 javadoc 中有一个例子).
- like this: Injecting JNDI datasources for JUnit Tests outside of a container
- or using classes in package
org.springframework.mock.jndi
, ie.SimpleNamingContextBuilder
(there's an example in the javadoc of this calass).
这篇关于如何使用 Spring 测试模拟的 JNDI 数据源?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!