【问题标题】:SpringBootTest failing - Why in single application test schema.sql and data.sql is executed twice?SpringBootTest 失败 - 为什么在单个应用程序测试中 schema.sql 和 data.sql 执行两次?
【发布时间】:2021-04-07 18:10:45
【问题描述】:

您好,我正在编写一个 SpringBoot 应用程序,我正在编写单元测试和集成测试,但是我的集成测试失败了?

原因一:尝试通过两次执行schema.sql创建表,因此抛出表已存在异常,测试失败。

原因 2: 即使我输入了 create if not exists,它也会通过执行 data.sql 在插入时失败,因为它会尝试第二次执行脚本并且发生唯一性约束违规。我知道我可以在一开始就删除表或删除记录以消除错误。

但为什么它会运行两次?不是三次或一次?

第一次测试

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class Atest {

}

第二次测试

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class Btest {

}

第三次测试

@SpringBootTest
public class Ctest {

}

AtestBtestpasses 并且他们尝试从测试数据中访问记录并且他们能够看到它。 但是 Ctest fails 由于异常

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "tbl_test" already exists; SQL statement:

因为test->resourece 文件夹data.sqlschema.sql 中有2 个文件。它尝试运行它们两次

我的问题:

  1. 为什么脚本会执行两次?
  2. 为什么不三次,每次测试一次?
  3. 我可以看到它们之间的唯一区别是 @SpringBootTest@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) 但它们仍然在一个执行周期或上下文中,因此不应该发生。
  4. 为什么当多个测试都有 @SpringBootTest 时它不会失败(比如三个都有这个注释)。

【问题讨论】:

  • 好吧,如果没有看到测试代码,很难看出问题是什么
  • 因为上下文不同。一个在模拟环境下运行,另一个在没有 Web 环境的情况下运行。由于这种差异,它将加载一个新的应用程序上下文。

标签: java spring-boot testing spring-data-jpa spring-boot-test


【解决方案1】:

M. Deinum 在他的评论中回答了这个问题:

因为上下文不同。一个在模拟环境下运行,另一个在没有 Web 环境的情况下运行。由于这种差异,它将加载一个新的应用程序上下文。

稍微扩展一下:Spring 测试基础架构缓存了用于测试的应用程序上下文。如果在多个测试中使用相同的配置设置ApplicationContextApplicationContext 将被重用。

由于ATestBTest 使用相同的配置,它们使用ApplicationContext 实例。由于schema.sqldata.sql 的执行发生在ApplicationContext 的构造过程中,因此它们只会执行一次。

CTest 使用不同的配置,因此 ApplicationContext 必须重新创建,因此脚本会再次执行。

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多