如何在春季提供测试数据源?

时间:2014-01-23 16:42:22

标签: java spring hibernate junit

我正在用Hibernate学习Spring。我有一个POJO模型类,注释了Hibernate注释,称为Person,PersonDao接口,它是hibernate实现和PersonService类。我正在使用注释,因此我们的spring-config.xml中没有将它们定义为bean。现在我想为我的PersonService类编写一些JUnit4测试,但我想在测试时使用不同的数据库。这是我的spring-config.xml

<context:component-scan base-package="org.example" />
<tx:annotation-driven />

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/example" />
    <property name="username" value="root" />
    <property name="password" value="pwd" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
            ...
        </list>
    </property>
</bean>

我想在我的测试中使用jdbc:mysql:// localhost / example_test数据库。我如何实现这一目标?

3 个答案:

答案 0 :(得分:3)

  • jdbc:mysql://localhost/example移至配置文件(db.properties

    database.uri = JDBC:MySQL的://本地主机/实例

  • 将此文件放在类路径中的某个位置(即src/main/resources

  • 在Spring上下文中设置属性占位符并使用数据库URI属性键

    <context:property-placeholder location="classpath:db.properties" />
    ...
    <property name="url" value="${database.uri}" />
    
  • 在测试类路径(src/test/resources)中创建具有相同名称的配置文件

  • 将数据库URI属性更改为测试值(jdbc:mysql://localhost/example_test

    database.uri = JDBC:MySQL的://本地主机/ example_test

利润

答案 1 :(得分:1)

dataSource的定义提取到单独的XML文件中,并在为测试和生产创建应用程序上下文时提供该文件的不同版本(即spring-config.xmldatasource-prod.xml用于生产和{{1并且spring-config.xml用于测试)。

或者,您可以使用profiles区分测试和生产环境,同时为两者使用相同的配置文件集。

另一种方法是保持datasource-test.xml的通用定义,但将其属性外部化为属性文件。但它不允许您对不同的环境使用完全不同的定义(例如,生产中的连接池和测试的简单dataSource。)

答案 2 :(得分:0)

您可以执行类似的操作,并使用其他数据源,会话工厂等指定另一个spring-context ...

@ContextConfiguration(locations = {
    "/spring-context-test.xml",
})
public class MyTestClass extends AbstractTransactionalJUnit4SpringContextTests
{

}