我有一个小型的Spring Web应用程序,具有典型的MVC服务DAO JPA / Hibernate持久层架构。在生产中,我使用类似JTA的持久性单元。通过容器向DAO注入EntityManager
通过@PersistenceContext
的实例。一切都很好。
现在,我想使用内存数据库(在本地PC上的容器之外)测试我的DAO实现。我可以手动创建一个基于EntityManager
的RESOURCE_LOCAL。但是我怎样才能自动将它注入我的DAO实现中呢?
我已经看到了这个question,它表明Spring可以实现。但是怎么样?
当然,对于单元测试,我可以使用new MyDAOImpl()
并自己注入EntityManager
,但稍后,我将要测试使用DAO实现注入的服务。我想避免自己连接所有东西......这可能吗?
答案 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" })
希望这有帮助!