【问题标题】:How can I execute @Sql before @BeforeAll (JUnit5)我如何在@BeforeAll(JUnit5)之前执行@Sql
【发布时间】:2020-06-08 23:06:50
【问题描述】:

我有一个具有以下场景的集成测试类:

  • 我希望首先加载一个 sql 脚本。为此,我在类级别使用 Spring @Sql 注释

  • 然后,我有一个 @BeforeAll (JUnit5) 方法,我只想在 @Sql 执行后执行一次。

我的问题是@BeforeAll 的内容是在导入@Sql 脚本之前执行的,而不是之后。

为什么会这样,我该怎么做才能颠倒顺序?

@SpringBootTest
@Transactional
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@Sql(scripts={"classpath:data-postgreForDemoAndIt.sql"}, executionPhase = BEFORE_TEST_METHOD)
public class DatingManagerIT {

(...) 

  @BeforeAll
    public void init() {

        MockitoAnnotations.initMocks(this);

        Member memberDenise = memberDao.findByEmail("denise@yahoo.fr", Member.class).get();
        Member memberAnne = memberDao.findByEmail("anne@yahoo.fr", Member.class).get();
        Member memberJulien = memberDao.findByEmail("julien@yahoo.fr", Member.class).get();
        memberDao.delete(memberDenise);
        memberDao.delete(memberAnne);
        memberDao.delete(memberJulien);
        memberFactory.createSampleMembers();
    }
(...)
}

【问题讨论】:

  • 只是想检查为什么你不能作为第一步执行 init() 中的 sql 脚本并在类级别删除 sql 注释。
  • 我实际上尝试了你所说的并注释了 init() 方法而不是类,但它并没有解决我的问题:在 @Sql 脚本之前执行 init() 中的指令已加载。
  • @Sql 在每个测试方法之前执行。如果你想执行一次,那么你需要在 init() 方法中作为第一步有问题地执行它。

标签: spring spring-boot junit5 spring-boot-test


【解决方案1】:

这可能已经是一个老问题了,但由于没有答案 - 这是我对它的有点肮脏的看法。

灵感来自javadoc

超类中的@BeforeEach 方法将在子类中的@BeforeEach 方法之前执行。

我尝试并发现了以下工作方法(代码已改编自我的测试用例):

  1. 使用@Sql 注解创建一个抽象超类,如下所示:
@Sql(scripts={"classpath:data-postgreForDemoAndIt.sql"}, executionPhase = BEFORE_TEST_METHOD)
public abstract class AsbtractSqlBasedTest{}
  1. 扩展它并将@BeforeAll 转换为@BeforeEach,并在类上使用静态标志以确保它只运行一次,如下所示:
@SpringBootTest
@Transactional
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
BEFORE_TEST_METHOD)
public class DatingManagerIT extends AsbtractSqlBasedTest {

  private static boolean initDone=false;

  @BeforeEach
    public void init() {
        if (initDone) return;
        initDone = true;
    
        MockitoAnnotations.initMocks(this);

        Member memberDenise = memberDao.findByEmail("denise@yahoo.fr", Member.class).get();
        Member memberAnne = memberDao.findByEmail("anne@yahoo.fr", Member.class).get();
        Member memberJulien = memberDao.findByEmail("julien@yahoo.fr", Member.class).get();
        memberDao.delete(memberDenise);
        memberDao.delete(memberAnne);
        memberDao.delete(memberJulien);
        memberFactory.createSampleMembers();
    }
(...)
}

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2010-10-24
    • 2021-03-08
    • 2023-04-02
    相关资源
    最近更新 更多