我尝试合并以下注解:
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
。我没有在测试级别上使用事务作用域,所以我需要在每个测试方法中清理表。如果每个测试方法都需要清理表,我想在@Before
方法中这样做,我不想在@SqlConfig
的每个测试方法中都这样做。我认为@Sql
在@Before
之前执行的行为是错误的。
1条答案
按热度按时间siv3szwd1#
默认情况下,通过
@Sql
执行的任何SQL脚本都将在任何@Before
方法之前执行。因此您遇到的行为是正确的,但您可以通过@Sql
中的executionPhase
属性更改执行阶段(参见下面的示例)。如果你想执行多个脚本,也可以通过
@Sql
。因此,如果您有一个名为
clean-parametro.sql
的清理脚本,它从PARAMETRO
表中删除数据,您可以像下面这样注解您的测试方法(而不是在@Before
方法中调用JdbcTestUtils.deleteFromTables()
)。当然,如果
dml-parametro.sql
将值插入到PARAMETRO
表中,那么在清理脚本中立即删除这些值可能没有意义。请注意,
@Sql
和@SqlConfig
为脚本执行提供了多级配置。例如,如果你想在测试前创建表,并在测试后清理表,你可以在Java 8上这样做:
或者在Java 6或Java 7上使用
@SqlGroup
作为容器:如果你的测试是
@Transactional
,并且你想清理提交的数据库状态,你可以指示Spring在一个新的事务中执行清理SQL脚本,如下所示:我希望这能为你澄清一些事情!
干杯
Sam (Spring TestContext Framework的作者)
备注:
AFTER_TEST_METHOD
从ExecutionPhase
静态导入ISOLATED
从TransactionMode
静态导入