当前位置: 首页 > 面试题库 >

如何在@Before方法之前执行@Sql

乐正宏深
2023-03-14
问题内容

我正在尝试结合以下注释:

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


 类似资料:
  • 我正在Java的Android应用程序中工作,其中调用类并在OnCreateView方法中进行测量。然而,一旦完成,我必须自动发送他的测量结果。但我不能。是否有继承自:java.lang.对象android.app.片段的方法,可以在OncreateView进程之后执行函数。因为目前数据已经发送,但还没有时间填充。 谢谢你的帮助

  • 我们使用maven surefire插件并行运行测试。由配置文件指定。 我希望在surefire并行运行我的测试之前,每次maven的整个执行过程中只能运行一次方法。我怎么能那么做?

  • 以下是项目结构: 项目结构 课前和课后 公有类BeforeAfter扩展Page实例{ 方法:包页; 导入Java . util . concurrent . time unit; 导入org . open QA . selenium . by;导入org . open QA . selenium . interactions . actions; 公共类MyFirstMethod扩展PageIn

  • 示例: 当我在测试套件中执行这些类时,首先执行类1的@test,然后打开一个新的浏览器实例,其中执行类2的@test。现在执行类1的第二个@test,然后执行类2的第二个@test。注意:在这种情况下测试并行为false。需要知道为什么会这样。我希望第一类的执行在第二类开始之前完成。我想不通。我做了一些变通办法,但没有奏效。 提前道谢。

  • 问题内容: 我正在编写一个swing应用,当执行某些方法时,我希望有“ wait”光标。我们可以这样: 我想要实现的是一个Java批注,该批注将在方法执行之前设置等待游标,并在执行后将其设置回正常状态。所以前面的例子看起来像这样 我怎样才能做到这一点?也欢迎提出有关解决此问题的其他方法的建议。谢谢! PS-我们在项目中使用Google Guice,但我不知道如何使用它来解决问题。如果有人为我提供类

  • 问题内容: 我正在寻找写两个角度指令,一个父指令和一个子指令,以创建可排序和可克隆的小部件。预期的标记是: 但是,子指令似乎在父元素之前,某个元素可用之前执行(子元素由父元素添加): 如您所见,我尝试设置优先级,但我认为由于它们位于不同的元素上,因此无法正常工作。 如何让父母先执行? 问题答案: 推理 以相反的顺序执行,这意味着子指令将在父指令之前(即深度优先)被调用。由于某种原因,这是默认行为(