2012-09-04 13 views
2

我有一个小型的Spring Web应用程序,具有典型的MVC服务DAO JPA/Hibernate持久层架构。在生产中,我使用了类似JTA的持久化单元。 DAO通过@PersistenceContext通过容器注入EntityManager的实例。一切皆好。在DAO中注入EntityManager用于内存数据库单元/集成测试?

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

我已经看到这个question,它表明它可能与春天。但是如何?

当然,对于单元测试,我可以使用new MyDAOImpl()并自己注入EntityManager,但后来我想测试注入DAO实现的服务。我想避免必须自己接通一切...这可能吗?

回答

1

在我们的项目中,我们定义了一个不同的单元测试-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 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" }) 

希望这有助于!

+0

创建指向内存数据库的实体管理器不是问题。问题是确保在运行容器外部的junit测试的同时将此实体管理器注入到带注释的类中。如何在你的JUnit测试中实现这一点?你有代码示例吗?谢谢。 – JVerstry

+0

“你的容器之外”是什么意思? – Vikdor

+0

当我从NetBeans运行我的JUnit测试时,代码不会在Tomcat中执行(例如)。因此,我不能使用像持久性单元这样的JTA连接我的DAO,Service等。我相信我需要使用RESOURCE_LOCAL持久性单元进行junit测试并手动创建实体管理器。 – JVerstry