如何防止在 Spring Boot 单元测试中执行 import.sql

Pac*_*man 9 java spring hibernate

我的类路径中有一个 import.sql 文件,其中包含一些 INSERT 语句。当使用 profile=devel 运行我的应用程序时,它的数据正在加载到 postgres 数据库中,到目前为止还可以。

当使用测试配置文件 import.sql 执行测试时,也会触发导入导致“找不到表”异常。不确定这里的原因是什么,但无论如何我都不想使用这些数据进行测试。

我怎么能阻止这个?为测试配置文件设置 hibernate.ddl-auto=none 似乎不是解决方案,因为它也阻止了模式的生成。

g00*_*00b 9

据我所知,你不能配置它。import.sql只要您使用create-dropcreate模式,Hibernate 就会自动调用该文件。这也是文档中提到的与Spring无关:

此外,import.sql如果 Hibernate 从头开始​​创建模式(即,如果ddl-auto属性设置为createcreate-drop),则在启动时会执行在类路径的根目录中命名的文件。

我的猜测是您仍然希望在测试场景中继续生成表。在这种情况下,您可能希望通过在类路径上添加一个名为schema.sql和的文件来切换到 Spring boot 的数据源初始化data.sql

该文件将在 Spring boot 启动时自动选取(仅适用于 Spring boot 2.0 中的嵌入式数据源),文档中也提到了这一点:

Spring Boot 可以自动创建 DataSource 的模式(DDL 脚本)并对其进行初始化(DML 脚本)。它分别从标准根类路径位置加载 SQL:schema.sqldata.sql

现在,为了能够在测试阶段禁用加载数据,您可以使用配置文件。例如,对于 Spring boot 2.x,您可以使用以下属性禁用它:

spring.datasource.initialization-mode=never # Property for Spring boot 2.0
spring.datasource.initialize=false # Property for Spring boot 1.0
Run Code Online (Sandbox Code Playgroud)

请注意,这会禁用架构创建和数据加载 SQL 文件。仅禁用data.sql文件是不可能的,但可以通过重命名 Spring boot 将查找的默认文件名使用一个简单的技巧来实现:

spring.datasource.data=somethingelse.sql
Run Code Online (Sandbox Code Playgroud)

如果您仅在测试期间配置此属性,Spring boot 将查找名为 的文件somethingelse.sql,而不会选择您的data.sql文件。当使用 dev 配置文件运行时,您会丢弃此属性,并且 Spring boot 将查找(并找到)data.sql.


适用于 Spring boot 的schema.sql/data.sql和 Hibernate 的另一种方法import.sql是使用 Maven 配置文件并在运行测试时加载不同的类路径文件夹。但是,我不建议这样做,因为它会使在 IDE 中运行测试变得更加困难。


Pac*_*man 5

我想我找到了一个更适合我的解决方案:

根据http://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html可以提供一个 data.sql 文件,该文件用数据初始化数据库。通常这会在每个配置文件中被选取,从而使用给定的测试数据填充测试或生产环境 - 不太好!

为了防止这种情况,我将其重命名为 populate_db.sql 并spring.datasource.data=populate_db.sql仅针对开发配置文件进行设置。