Mat*_* G. 4 java junit spring hibernate h2
首先我的设置:
一点背景:
我有一个REST Web服务,它部署在Tomcat Web服务器上,下面有一个h2数据库.我有一个没有任何POST/PUT方法的REST服务.在为其编写集成测试时,我使用H2控制台手动添加了数据库中的条目,并将h2文件放在服务器上.最后,我的集成测试调用REST服务,并返回在DB中手动注入的数据,测试成功.这是不可维护的,为每个测试注入我需要的数据会很棒(这种方法可以用于以后的其他集成测试......).目标是将数据注入与Tomcat上部署的应用程序使用的数据库相同的数据库中.
我认为这很容易,我编写了一个集成测试,重用了服务器端使用的相同应用程序上下文:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="${database.url}" />
<property name="username" value="" />
<property name="password" value="" />
</bean>
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="be.wiv_isp.healthdata.catalogue.domain" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
</props>
</property>
</bean>
<bean id="jpaVendorAdaptor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf" />
</bean>
Run Code Online (Sandbox Code Playgroud)
数据库url在属性fil中定义的位置:
database.url=jdbc:h2:file:${healthdata.working.dir}/database/database-catalogue;AUTO_SERVER=true
Run Code Online (Sandbox Code Playgroud)
然后我将EntityManager注释为我的PersistenceContext并编写了一个简单的单元测试:
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = {"classpath:/applicationContext-it-test.xml"})
public class H2Test {
@PersistenceContext
private javax.persistence.EntityManager em;
DataCollectionDefinition dcd = new DataCollectionDefinitionBuilder()
.withId(Long.valueOf(1))
.build();
@Before
public void init() {
em.persist(dcd);
em.flush();
em.clear();
}
@Test
public void testGet() {
DataCollectionDefinition found = em.find(DataCollectionDefinition.class, 1);
Assert.assertEquals(found, dcd);
}
}
Run Code Online (Sandbox Code Playgroud)
这个测试运行正常!但是当我在使用EntityManager刷新数据并且连接到我的H2文件系统数据库之后放置断点时,没有注入任何内容!
现在我在想.使用Spring NEVER的JUnit实际上是否将数据保存在数据库中并将其保存在内存中是否正常?并且有没有办法坚持它,所以我可以使用它来预填充数据库以进行集成测试.
现在我有一个变通方法使用好老的JDBC存储我的数据,但它是肮脏的,我认为它应该工作使用Spring和高于一切,我想明白为什么数据不使用Spring的EntityManager的坚持......
| 归档时间: |
|
| 查看次数: |
13265 次 |
| 最近记录: |