【问题标题】:How to prevent import.sql being executed in Spring Boot unit test如何防止在 Spring Boot 单元测试中执行 import.sql
【发布时间】:2016-12-16 16:03:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring hibernate


    【解决方案1】:

    据我所知,您无法配置它。只要您使用create-dropcreate 模式,Hibernate 就会自动调用import.sql 文件。 the documentation也提到了这个,和Spring无关:

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

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

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

    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
    

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

    spring.datasource.data=somethingelse.sql
    

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


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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这并不能解决问题,重命名所以也不会在dev模式下执行文件,这将需要运行
      • @MohammedRafeeq 这不是真的。您可以使用配置文件为每个环境正确配置spring.datasource.data
      【解决方案3】:

      您可以在“test”文件夹下的“/resources”文件夹中添加一个空的“import.sql”文件,例如“源/测试/资源”。 这样,当您运行测试时,hibernate 将执行“test/resources”文件夹中的空“import.sql”(而不是执行主文件夹中的实际“import.sql”文件)。

      【讨论】:

        猜你喜欢
        • 2018-12-18
        • 2016-04-26
        • 1970-01-01
        • 2019-09-10
        • 1970-01-01
        • 2015-11-05
        • 2016-05-28
        • 2017-02-20
        相关资源
        最近更新 更多