使用嵌入式 H2 数据库进行测试 - 导入数据正常,当测试为 运行 时,它会尝试再次初始化数据,然后找不到 table

Testing with embedded H2 database - importing data goes fine, when a test is run, it tries to init data again, then fails to find a table

我正在努力使用我想用于测试的 H2 嵌入式数据库。

我认为这个过程分为两个步骤:

好像后面一步根本没有用到我的嵌入式数据库。它可能会以某种方式尝试创建一个新的。但是,如果是这样,我不明白为什么那行不通——相反,我得到了主键违规,在我看来,相同的数据被插入到现有的 table 中,并且数据已经存在。

如果其他人有 same/similar 问题,请回答我自己的问题。

  • ...
  • 运行 我的一项测试。 这失败了。似乎当测试是 运行 时,它会尝试重新执行我的数据初始化脚本,然后失败(与主键违规有关的错误)。另外,如果我在 context.xml 中注释掉定义脚本的部分,然后重试测试 - 我得到 Table xyz not found

基本上,它确实尝试重新执行脚本。解决方案是在 CREATE 之前 DROP table IF EXISTS 每个 table。

第二个关键部分:table xyz not found 错误。问题不是找不到 table——而是执行查询时缺少的模式名称(实际上,未设置)。

这就是我需要的(注意注释):

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />

    <property name="persistenceUnitName" value="tests" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="true"/>
            <property name="database" value="H2" />
        </bean>
    </property>
    <!-- BELOW PROPERTY, namely the default_schema key -->
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">none</prop>
            <prop key="hibernate.default_schema">TESTINGDB</prop>
        </props>
    </property>
</bean>

如果没有这个配置,我的测试模式就不会被采用,tables 被声明为未找到。