我试图结合以下注释:
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中的代码在脚本&#34; dml-parametro.sql&#34;之后运行。在@Sql注释中。
这样做是对的吗?
为了解决这个问题,我使用@After而不是@Before,但是我想在测试执行之前先删除表,而不是之后。
我不想使用@SqlConfig。我没有在测试级别上使用transacional范围,所以我需要在每个测试方法中清理我的表。如果每个测试方法都需要清理表,我想在@Before方法中执行此操作。我不想在每个使用@SqlConfig的测试方法中执行此操作。我认为@Sql在@Before之前执行的行为是错误的。
答案 0 :(得分:43)
默认情况下,通过@Sql
执行的任何SQL脚本都将在任何@Before
方法之前执行。因此,您遇到的行为是正确的,但您可以通过executionPhase
中的@Sql
属性更改执行阶段(请参阅下面的示例)。
如果您想执行多个脚本,也可以通过@Sql
。
因此,如果您有一个名为clean-parametro.sql
的清除脚本从PARAMETRO
表中删除,您可以像下面那样注释您的测试方法(而不是在JdbcTestUtils.deleteFromTables()
中调用@Before
{1}}方法)。
@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() { /* ... */ }
我希望这能为你澄清事情!
干杯,
Sam (Spring TestContext Framework的作者)
注意:
AFTER_TEST_METHOD
是从ExecutionPhase
ISOLATED
是从TransactionMode