使用嵌入式 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基本上,它确实尝试重新执行脚本。解决方案是在CREATE
ing 之前对每个表进行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 数据库进行测试 - 导入数据正常,运行测试时,它会再次尝试初始化数据,然后找不到表的主要内容,如果未能解决你的问题,请参考以下文章
在 Google App Engine 中使用 h2 数据库进行本地开发