如何使用JUNIT测试Spring JdbcTemplate?

5

我有一个DAO,正在尝试进行测试,其中使用了jdbcTemplate。spring jdbcTemplate上有一个datasource属性,需要设置才能正常工作。但是,在JUNIT测试运行时,数据源不存在,因此bean创建失败。如何设置jdbcTemplate的数据源以在JUNIT测试用例中正常工作?

非常感谢任何帮助。

谢谢

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'thisDatasource' defined in class path resource [userDataBaseContext.xml]: Invocation of init method failed; nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
    ... 33 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154)
    at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
    at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
    at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
    at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:201)
    at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:187)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1479)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
    ... 40 more
2个回答

2
使用Spring测试框架。它允许您的单元测试利用为您的应用程序上下文配置的Spring容器。一旦设置,您可以在数据源上使用@Autowired来注入所需的数据源以测试jdbcTemplate。
以下是我使用Spring-Data进行测试的示例之一。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import org.tothought.entities.Post;
import org.tothought.entities.PostPart;
import org.tothought.entities.Tag;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Transactional
public class PostRepositoryTest {

    @Autowired 
    TagRepository tagRepository;

    @Test
    public void findOneTest() {
        Post post = repository.findOne(1);
        assertNotNull(post);
        assertTrue(post.getTags().size()>1);
    }
}

注意@ContextConfiguration注释。该注释指向用于设置Spring容器的上下文,我从中注入了我的存储库。由于我没有为上下文指定名称,因此Spring会在与我的测试类相同的目录中搜索名为PostRepositoryTest-context.xml的配置文件。有关此设置的详细信息,请参阅上面提供的文档。
要开始使用该项目,请在您的pom.xml文件中包含以下内容。
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>

感谢您提供有关Spring测试框架的详细信息。我认为我已经掌握了“注入”数据源的要点。我遇到的问题是,因为我正在运行JUnit测试,所以数据源不存在。数据源是服务器端元素,而JUnit测试在服务器外部运行。更好的问题可能是,如何伪造数据源以在JDBCTemplate的JUnit测试中使用。 - E Paiz

1
我使用以下链接中的信息解决了我的问题: 如何使用Spring测试模拟的JNDI数据源? 与使用在我的Spring文件中定义的数据源不同,我只是创建了一个新的数据源:
<bean id="thisDatasource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
p:url="jdbc:sqlserver://sqlserver:1234;databaseName=myTables"
p:username="userid"
p:password="passw0rd" /> 


<bean id="databaseUserDAOTest" 
class="com.spring.security.custom.user.detail.DatabaseUserDAO" >
<!-- Inject the datasource of the jdbcTemplate -->
<property name="dataSource" ref="thisDatasource" />        
</bean>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接