当前位置: 首页 > 知识库问答 >
问题:

使用实体管理器的Spring junit测试不会在H2文件系统数据库中插入数据

翟奇
2023-03-14

首先我的设置:

  • JUnit版本:4.11
  • H2版本:1.3.174
  • Spring版本:4.0.5。发布
  • Hibernate版本:4.1.0。最终

一点背景:

我有一个部署在Tomcat web服务器上的REST web服务,它下面有一个h2数据库。我有一个REST服务,它没有任何POST/PUT方法。在为其编写集成测试时,我使用H2控制台在DB中手动添加条目,并将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>

其中数据库url在属性文件中定义:

database.url=jdbc:h2:file:${healthdata.working.dir}/database/database-catalogue;AUTO_SERVER=true

然后我将EntityManager注释为我的PeristenceContext,并编写了一个简单的单元测试:

@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);
    }
}

此测试运行良好!然而,当我在使用EntityManager刷新数据后放置断点,并连接到H2文件系统数据库时,没有注入任何内容!

现在我在想。使用Spring的JUnit从未真正将数据持久化到数据库中并将其保存在内存中,这是否正常?是否有一种方法可以保存它,以便我可以使用它为集成测试预填充数据库。

现在我有一个解决方法,使用好的旧JDBC存储我的数据,但它很脏,我认为它应该使用Spring工作,最重要的是,我想了解为什么数据不使用Spring的EntityManager持久化...

共有2个答案

咸晨
2023-03-14

在类级别或方法级别添加@Commit。检查此项

当声明为类级注释时,@Commit为测试类层次结构中的所有测试方法定义了默认提交语义学。当声明为方法级注释时,@Commit为特定测试方法定义了提交语义学,可能会覆盖类级默认提交或回滚语义学。

松嘉运
2023-03-14

现在的情况是JPA的工作方式和Spring在运行事务测试时的工作方式的结合。

首先,JPA当实体持久化在JPA中时,这并不意味着数据实际上持久化到数据库中。通常,当当前事务提交时,或者当您刷新实体管理器时,数据将被推送到数据库。通过简单的谷歌搜索,您可以在众多答案中找到这个SO答案。

其次,当Spring运行一个带有事务注释的测试时,默认情况下,它将在测试完成时回滚事务。检查许多类似问题。为了覆盖该默认行为,您需要使用回滚(false)。

使用JDBC时,数据会写入文件,因为您在Spring为测试创建的事务之外运行语句,因此默认回滚没有要还原的数据。

 类似资料:
  • 如何使用h2database配置spring boot,以便在每次重新启动时重用数据库。 这是我申请表中唯一的一行。属性文件 spring.jpa.databaseorg.hibernate.dialect.方言

  • 我有一个在mySQL上运行的小型数据库应用程序。 我想使用H2进行测试。 我向build.gradle添加了必要的依赖项: runtimeOnly’com。h2数据库:h2' 然而,我注意到,在完成测试之后,我的mySQL数据库包含测试期间生成的字段,就好像spring没有使用H2一样。 有什么问题吗?

  • 本文向大家介绍基于文件的数据管理系统,包括了基于文件的数据管理系统的使用技巧和注意事项,需要的朋友参考一下 用于组织和维护数据文件的系统称为基于文件的数据系统。这些文件系统用于处理单个或多个文件,效率不高。  功能性 基于文件的数据管理系统的功能如下- 基于文件的系统有助于任何用户的基本数据管理。 基于文件的系统中存储的数据应保持一致。在基于文件的系统中完成的任何事务都不应更改一致性属性。  基于

  • 本文向大家介绍数据库管理系统的优势,包括了数据库管理系统的优势的使用技巧和注意事项,需要的朋友参考一下 数据库管理系统(DBMS)定义为允许用户定义,创建,维护和控制对数据库访问的软件系统。DBMS使最终用户可以创建,读取,更新和删除数据库中的数据。它是程序和数据之间的一层。 与基于文件的数据管理系统相比,数据库管理系统具有许多优势。这些优点中的一些在下面给出- 减少数据冗余 基于文件的数据管理系

  • 主要内容:什么是数据库,数据库管理系统,DBMS的特征,DBMS的优点,DBMS的缺点,学习前提条件,面向读者,问题反馈DBMS教程提供了数据库的基本和高级概念。 我们的DBMS教程专为初学者和专业人士设计。数据库管理系统是用于管理数据库的软件。 DBMS教程包括DBMS的所有主题,如介绍,ER模型,键,关系模型,连接操作,SQL,函数依赖,事务,并发控制等。 什么是数据库 数据库是相互关联数据的集合,用于有效地检索,插入和删除数据。 它还用于以表格,模式,视图和报告等形式组织数据。 例如: 学