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执行之后执行一次
@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()方法中有问题地执行它。