使用嵌入式 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 嵌入式数据库。
我认为这个过程分为两个步骤:
- 构建我的项目,在此期间将创建架构并初始化数据。
这似乎工作正常,因为我可以通过 H2 控制台查看数据库 - table 在那里,它们包含数据
- 运行 我的一项测试。 这失败了。似乎当测试是 运行 时,它会尝试重新执行我的数据初始化脚本,然后失败(与主键违规有关的错误)。另外,如果我在 context.xml 中注释掉定义脚本的部分,然后重试测试 - 我得到 Table xyz not found
好像后面一步根本没有用到我的嵌入式数据库。它可能会以某种方式尝试创建一个新的。但是,如果是这样,我不明白为什么那行不通——相反,我得到了主键违规,在我看来,相同的数据被插入到现有的 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 被声明为未找到。
我正在努力使用我想用于测试的 H2 嵌入式数据库。
我认为这个过程分为两个步骤:
- 构建我的项目,在此期间将创建架构并初始化数据。 这似乎工作正常,因为我可以通过 H2 控制台查看数据库 - table 在那里,它们包含数据
- 运行 我的一项测试。 这失败了。似乎当测试是 运行 时,它会尝试重新执行我的数据初始化脚本,然后失败(与主键违规有关的错误)。另外,如果我在 context.xml 中注释掉定义脚本的部分,然后重试测试 - 我得到 Table xyz not found
好像后面一步根本没有用到我的嵌入式数据库。它可能会以某种方式尝试创建一个新的。但是,如果是这样,我不明白为什么那行不通——相反,我得到了主键违规,在我看来,相同的数据被插入到现有的 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 被声明为未找到。