在DAO中注入EntityManager以进行内存数据库单元/集成测试?

时间:2012-09-04 13:46:58

标签: java spring testing entitymanager

我有一个小型的Spring Web应用程序,具有典型的MVC服务DAO JPA / Hibernate持久层架构。在生产中,我使用类似JTA的持久性单元。通过容器向D​​AO注入EntityManager通过@PersistenceContext的实例。一切都很好。

现在,我想使用内存数据库(在本地PC上的容器之外)测试我的DAO实现。我可以手动创建一个基于EntityManager的RESOURCE_LOCAL。但是我怎样才能自动将它注入我的DAO实现中呢?

我已经看到了这个question,它表明Spring可以实现。但是怎么样?

当然,对于单元测试,我可以使用new MyDAOImpl()并自己注入EntityManager,但稍后,我将要测试使用DAO实现注入的服务。我想避免自己连接所有东西......这可能吗?

1 个答案:

答案 0 :(得分:1)

在我们的项目中,我们定义了一个不同的unit-testing-config.xml,它定义了数据源bean以指向内存数据库,如下所示:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="org.hsqldb.jdbc.JDBCDriver" />
        <property name="jdbcUrl"
                value="jdbc:hsqldb:file:/data/data.db" />
        <property name="user" value="sa" />
        <property name="password" value="" />
        <property name="initialPoolSize" value="1" />
        <property name="minPoolSize" value="1" />
        <property name="maxPoolSize" value="50" />
        <property name="maxIdleTime" value="240" />
        <property name="checkoutTimeout" value="60000" />
        <property name="acquireRetryAttempts" value="0" />
        <property name="acquireRetryDelay" value="1000" />
        <property name="numHelperThreads" value="1" />
</bean>

正常entityManagerFactory定义如下将使用上述datasource bean:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="myDoctorPersistenceUnit" />
    <property name="loadTimeWeaver">
        <bean
            class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
            <property name="generateDdl" value="true" />
            <property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect" />
        </bean>
    </property>
    <property name="jpaDialect" ref="jpaDialect" />
</bean>

我们使用以下注释运行TestSuite

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={ "/spring-configuration/test-spring.xml" })

希望这有帮助!