如何在每个测试方法之前和之后执行sql脚本

jwp*_*pol 6 java junit spring jpa spring-boot

spring中有一个@Sql注解,允许在测试方法之前和之后执行sql代码:

@Test
@Sql("init.sql")
@Sql(scripts = "clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public void someTest()
{
}
Run Code Online (Sandbox Code Playgroud)

然而,我有几种测试方法,我想提供与上面的测试相同的干净环境,并且我不想为每个测试重复相同的@Sql注释。如何一次性完成所有方法?例如:

// JPA and Spring other test annotations
@Sql("init.sql")
@Sql(scripts = "clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public class TestClass
{
  // init.sql executed before every test, clean.sql executed after every test
}
Run Code Online (Sandbox Code Playgroud)

jwp*_*pol 7

事实上,当您放置@Sql在 上时classsql脚本将在该类中定义的每个测试之前和之后执行,更具体地说是在方法之前@Before和之后执行@After。所以,

// JPA and Spring other test annotations
@Sql("init.sql")
@Sql(scripts = "clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public class TestClass
{
  // init.sql executed before every test, clean.sql executed after every test
}
Run Code Online (Sandbox Code Playgroud)

将根据@Sql定义工作:

@Target({ElementType.TYPE, ElementType.METHOD})
/// other annotations
public @interface Sql {
   //
}
Run Code Online (Sandbox Code Playgroud)