2

我有一个小型 Spring Web 应用程序,具有典型的 MVC Service DAO JPA/Hibernate Persistence Layer 架构。在生产中,我使用类似 JTA 的持久性单元。DAO由容器注入一个EntityManagervia的实例。@PersistenceContext一切皆好。

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

我已经看到了这个问题,它表明 Spring 是可能的。但是怎么做?

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

4

1 回答 1

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定义如下将使用上面的datasourcebean:

<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" })

希望这可以帮助!

于 2012-09-04T13:54:09.053 回答