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

Posted

技术标签:

【中文标题】使用嵌入式 H2 数据库进行测试 - 导入数据正常,运行测试时,它会再次尝试初始化数据,然后找不到表【英文标题】: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 【发布时间】:2018-09-25 08:49:04 【问题描述】:

我正在为我想用于测试的 H2 嵌入式数据库而苦苦挣扎。

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

构建我的项目,在此期间将创建架构并初始化数据。 这似乎工作正常,因为我可以通过 H2 控制台查看数据库 - 表在那里,它们包含数据 运行我的一项测试。 这失败了。似乎在运行测试时它尝试重新执行我的数据初始化脚本,然后失败(与主键违规有关的错误)。另外,如果我在 context.xml 中定义脚本的部分注释掉,然后重试测试 - 我得到 Table xyz not found

似乎后一步根本不使用我的嵌入式数据库。不知何故,它可能正在尝试创建一个新的。但是,如果是这样,我不明白为什么这不起作用 - 相反,我得到主键违规,在我看来,相同的数据被插入到现有表中,并且数据已经存在。

【问题讨论】:

您什么也没提供,我们怎么知道问题出在哪里?我建议您使用属性文件配置您的数据库,然后为测试范围重写此属性文件并为数据库初始化创建规则 - 然后将此规则应用为 Rule 或 ClassRule。 【参考方案1】:

如果其他人有相同/相似的问题,请回答我自己的问题。

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

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

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

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

    <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>

如果没有这个配置,我的测试架构就不会被假定并且表被声明为未找到。

【讨论】:

以上是关于使用嵌入式 H2 数据库进行测试 - 导入数据正常,运行测试时,它会再次尝试初始化数据,然后找不到表的主要内容,如果未能解决你的问题,请参考以下文章

Confluence 6 嵌入的 H2 数据库

Confluence 6 嵌入的 H2 数据库

在 Google App Engine 中使用 h2 数据库进行本地开发

H2 嵌入式数据库在 Spring Boot 测试期间未获取属性

为testng Spring配置H2数据库

如何使用 H2 嵌入式数据库获取序列中的下一个值?