如何在@Before方法之前执行@Sql
我正在尝试结合以下注释:
org.springframework.test.context.jdbc.Sql 和 org.junit.Before
像下面的代码:
@Test@Sql(scripts = "dml-parametro.sql")
public void testData(){
Iterable<Parametro> parametros = parametroService.findAll();
List<Parametro> parametrosList = Lists.newArrayList(parametros);
Assert.assertThat(parametrosList.size(), Is.is(1));
}
@Before
public void beforeMethod() {
JdbcTestUtils.deleteFromTables(jdbcTemplate, "PARAMETRO");
}
@Before方法中的代码在@Sql批注中的脚本“ dml-parametro.sql”之后运行。
这样做对吗?
对于此解决方案,我使用@After而不是@Before,但我想在测试执行之前而不是之后cdelete表。
我不想使用@SqlConfig。我没有在测试级别上使用Transacional范围,因此我需要在每种测试方法中清除表。如果每个测试方法都需要清理表,我想在@Before方法中做到这一点。我不想在每个使用@SqlConfig的测试方法中执行此操作。我认为@Sql比@Before之前执行的行为是错误的。
回答:
默认情况下,通过@Sql
执行的任何SQL脚本将在执行任何方法之前执行@Before。因此,你遇到的行为是正确的,但是你可以通过中的executionPhase
属性更改执行阶段@Sql(请参见下面的示例)。
如果要执行多个脚本,也可以通过来执行@Sql。
所以,如果你有一个清理脚本命名clean-parametro.sql
从删除PARAMETRO表,你可以注释类似下面的测试方法(而不是调用JdbcTestUtils.deleteFromTables()
你的@Before
方法)。
@Test@Sql({"dml-parametro.sql", "clean-parametro.sql"})
public void test() { /* ... */ }
当然,如果dml-parametro.sql
将值插入PARAMETRO
表中,则立即删除清理脚本中的这些值可能没有意义。
请注意,@Sql
并@SqlConfig
为脚本执行提供了多个配置级别。
例如,如果要在测试之前创建表并在测试之后进行清理,则可以在Java 8上执行以下操作:
@Test@Sql("create-tables.sql")
@Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD)
public void test() { /* ... */ }
或@SqlGroup
用作Java 6或Java 7上的容器:
@Test@SqlGroup({
@Sql("create-tables.sql"),
@Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD)
})
public void test() { /* ... */ }
如果测试通过,@Transactional
并且你想要清除已提交的数据库状态,则可以指示Spring在新事务中执行清除SQL脚本,如下所示:
@Test@Sql("insert-test-data.sql")
@Sql(
scripts = "clean-up.sql",
executionPhase = AFTER_TEST_METHOD,
config = @SqlConfig(transactionMode = ISOLATED)
)
public void test() { /* ... */ }
我希望这可以为你澄清一切!
Cheers,
Sam (author of the Spring TestContext Framework)
笔记:
AFTER_TEST_METHOD
是从静态导入的ExecutionPhase
ISOLATED
是从静态导入的TransactionMode
以上是 如何在@Before方法之前执行@Sql 的全部内容, 来源链接: utcz.com/qa/429293.html