Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何在@BeforeAll(JUnit5)之前执行@Sql_Spring_Spring Boot_Junit5_Spring Boot Test - Fatal编程技术网

Spring 如何在@BeforeAll(JUnit5)之前执行@Sql

Spring 如何在@BeforeAll(JUnit5)之前执行@Sql,spring,spring-boot,junit5,spring-boot-test,Spring,Spring Boot,Junit5,Spring Boot Test,我有一个集成测试类,具有以下场景: 我希望首先加载一个sql脚本。为此,我在类级别使用Spring@Sql注释 然后,我有一个@BeforeAll(JUnit5)方法,我只想在@Sql执行之后执行一次 我的问题是@BeforeAll的内容是在导入@Sql脚本之前执行的,而不是之后执行的 为什么会这样,我能做些什么来颠倒顺序 @SpringBootTest @交易的 @TestInstance(TestInstance.Lifecycle.PER_类) @Sql(scripts={“class

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

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

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

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

为什么会这样,我能做些什么来颠倒顺序

@SpringBootTest
@交易的
@TestInstance(TestInstance.Lifecycle.PER_类)
@Sql(scripts={“classpath:data postgreefordemandit.Sql”},executionPhase=BEFORE\u TEST\u METHOD)
公共类数据管理器{
(...) 
@以前
公共void init(){
initMocks(this);
Member memberDenise=memberDao.findByEmail(“denise@yahoo.fr,Member.class);
Member memberAnne=memberDao.findByEmail(“anne@yahoo.fr,Member.class);
Member memberJulien=memberDao.findByEmail(“julien@yahoo.fr,Member.class);
memberDao.delete(memberDenise);
memberDao.delete(memberAnne);
memberDao.delete(memberJulien);
createSampleMembers();
}
(...)
}

这可能已经是一个老问题了,但既然没有答案,下面是我对这个问题的一些肮脏的看法

灵感来源于:

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

我尝试并找到了以下工作方法(代码已从我的测试用例中改编):

  • 使用
    @Sql
    注释创建一个抽象超类,如下所示:
  • @Sql(scripts={“classpath:data postgreefordemoandit.Sql”},executionPhase=BEFORE\u TEST\u方法)
    公共抽象类AsbtractSqlBasedTest{}
    
  • 扩展它并将
    @beforeach
    转换为
    @beforeach
    ,在类上使用静态标志确保它只运行一次,如下所示:
  • @SpringBootTest
    @交易的
    @TestInstance(TestInstance.Lifecycle.PER_类)
    试验前(试验方法)
    公共类DatingManager扩展了AsbtractSqlBasedTest{
    私有静态布尔initDone=false;
    @之前
    公共void init(){
    如果(initDone)返回;
    initDone=true;
    initMocks(this);
    Member memberDenise=memberDao.findByEmail(“denise@yahoo.fr,Member.class);
    Member memberAnne=memberDao.findByEmail(“anne@yahoo.fr,Member.class);
    Member memberJulien=memberDao.findByEmail(“julien@yahoo.fr,Member.class);
    memberDao.delete(memberDenise);
    memberDao.delete(memberAnne);
    memberDao.delete(memberJulien);
    createSampleMembers();
    }
    (...)
    }
    
    只是想检查一下为什么不能在init()中执行sql脚本作为第一步,并删除类级别的sql注释。我实际上尝试了您所说的内容,并注释了init()方法,而不是类,但这并没有解决我的问题:init()中的指令在加载@Sql脚本之前执行。@Sql在每个测试方法之前执行。如果您想执行一次,那么第一步需要在init()方法中有问题地执行它。