【问题标题】:Execute @Sql after @BeforeEach in Integration Test在集成测试中在@BeforeEach 之后执行@Sql
【发布时间】:2021-12-22 10:37:31
【问题描述】:

目前我正在进行集成测试,并且这个控制器涵盖了许多表,因此使用 @BeforeEach 插入事务数据,我想使用 sql 脚本,我尝试过这样..

  @Sql(scripts = {"classpath:/business-test-data.sql"})
  public class IntegrationTest extend AbstractIT {

    @BeforeEach
    void init() {
      // method from AbstractIT
      // Clear DB, Redis, Kafka, etc
    }
   
    @Test
    void someTest(){}

.. 原来 Spring 在清除 DB 之前执行了 business-test-data.sql

那么,清除数据库后如何执行business-test-data.sql?任何建议或其他方法将不胜感激。谢谢。

注意事项:

  1. 对于模式和主数据,它们已经与嵌入式 postgres 初始化一起执行,我想避免使用此脚本插入事务数据。
  2. Clear DB 是继承自 AbstractIT 类的方法,更改清除表的方式看起来也会影响其他集成测试,所以我也想避免它。

【问题讨论】:

    标签: spring spring-boot integration-testing


    【解决方案1】:

    类级别的@Sql 将在测试套件运行之前执行一次。

    @BeforeEach 将在每个测试方法之前执行。

    所以看起来您还需要在每个方法之前运行 @Sql。您可以在同一方法中手动执行此操作,也可以使用 @sql 注释方法(因此不是在类级别,而是在方法级别)

    在此处查看更多信息https://www.baeldung.com/spring-boot-data-sql-and-schema-sql#sqlannotation

    【讨论】:

    • 我试过了,没有区别。经过一番研究,@Sql 有属性 executionPhase ,并且默认设置为 BEFORE_TEST_METHOD,所以看起来默认情况下脚本在每个测试用例之前执行。
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2019-03-22
    • 2020-12-31
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多