在Spring应用程序中为JUnit测试分离DB

时间:2014-02-05 11:38:28

标签: spring junit persistence

我正在使用文件内HSQL db为我的Spring应用程序编写单元测试。我不想用测试数据污染这个数据库,所以我试图设置另一个内存中的HSQL数据库实例用于测试。

在我的抽象测试类中,我导入测试应用程序上下文XML配置:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testingContext.xml")
@Transactional
public abstract class AbstractDaoForTesting {

testingContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    ">


    <jdbc:embedded-database id="dataSource" type="HSQL" />


        <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="packagesToScan" value="com.se.micom" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
            </property>
            <property name="jpaProperties">
                <props>
                    <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
                    <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                </props>
            </property>
        </bean>


    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="myEmf" />
    </bean>

    <tx:annotation-driven />

<bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
  <bean id="characteristicDao" class="com.se.micom.dao.CharacteristicDaoImpl"/>
  <bean id="functionalityDao" class="com.se.micom.dao.FunctionalityDaoImpl"/>
  <bean id="segmentDao" class="com.se.micom.dao.SegmentDaoImpl"/>
  <bean id="segmentService" class="com.se.micom.service.SegmentServiceImpl"/>
  <bean id="functionalityService" class="com.se.micom.service.FunctionalityServiceImpl"/>
  <bean id="characteristicService" class="com.se.micom.service.CharacteristicServiceImpl" />
</beans>

到目前为止,内存中的HSQL db在测试中运行良好。

但是,只要我在persistence.xml src/main/resources/META-INF单元测试中引入我的项目testingContext.xml,就会开始使用此持久性单元而不是<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="micomPU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>com.se.micom.dao.domain.Characteristic</class> <class>com.se.micom.dao.domain.Functionality</class> <class>com.se.micom.dao.domain.Segment</class> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:D:\workspace_java\Micom2\db\micom"/> <property name="javax.persistence.jdbc.password" value=""/> <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/> <property name="javax.persistence.jdbc.user" value="sa"/> </properties> </persistence-unit> </persistence> 中的持久性单元。

的persistence.xml

persistence.xml

此配置有什么问题?为什么测试“更喜欢”使用{{1}}中定义的db?

1 个答案:

答案 0 :(得分:0)

您的问题是Spring配置文件的完美示例。如果你想要使用某个bean,那么让多个bean同时在你的上下文中做同样的事情总是有问题的。

您应该有两个不同的配置文件"prod""test",并使用<beans profile="XYZ"> ... </beans>相应地将您的bean声明包装在xml配置中。可以找到更广泛的示例here

然后,您可以使用@Profile("test")注释您的测试,它应该使用正确的数据库。