gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:41:24 24 4
gpt4 key购买 nike

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

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

我看过这个question它表明使用 Spring 是可能的。但是怎么办?

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

最佳答案

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

希望这对您有所帮助!

关于java - 在 DAO 中注入(inject) EntityManager 以进行内存数据库单元/集成测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12264876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com