如何使用Spring测试模拟的JNDI数据源?

Mar*_*rco 31 testing junit spring datasource mocking

我是Spring的新手,想知道如何创建使用模拟数据源的JUnit测试以及如何使用JNDI上下文?目前,我的应用程序使用tomcat中的JNDI上下文来检索连接,并通过该连接从数据库中检索数据.所以我想我需要模拟JNDI调用和数据检索.关于解决这个问题的最佳方法的任何好的指针都会很棒!非常感谢!

pru*_*ule 35

您可以使用SimpleNamingContextBuilder为您的测试提供jndi数据源:

    SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
    builder.bind("java:comp/env/jdbc/mydatasource", dataSource);
    builder.activate();
Run Code Online (Sandbox Code Playgroud)

https://fisheye.springsource.org/browse/spring-framework/spring-test/src/main/java/org/springframework/mock/jndi/SimpleNamingContextBuilder.java?hb=true

这并不是完全嘲弄数据源,但它确实可以通过jndi为您的测试提供数据源.

  • 我这样做了,但仍然遇到异常 原因是:javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或者作为小程序参数,或者在应用程序资源文件中指定类名:java.naming.factory。最初的 (2认同)

Roa*_*ner 32

我通常在单独的文件中定义我的JNDI依赖项,如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>
Run Code Online (Sandbox Code Playgroud)

因此,在测试资源中,我可以创建另一个文件并定义测试数据源但是它适合我,例如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>
Run Code Online (Sandbox Code Playgroud)

然后在我的测试类中,我使用数据源的测试配置而不是依赖于JNDI 的生产测试配置:

@ContextConfiguration({
    "classpath*:META-INF/spring/datasource-testcontext.xml",
    "classpath*:META-INF/spring/session-factory-context.xml"
})
public class MyTest {

}
Run Code Online (Sandbox Code Playgroud)

如果数据源未在单独的文件中定义您仍可以轻松地存根JNDI调用返回的对象: