web-dev-qa-db-ja.com

@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」の後に実行されます。

これを行うのは正しいですか?

これを解決するために、@ Beforeよりも@Afterを使用していますが、テストの実行前ではなく、実行前にテーブルを削除したいと思います。

@SqlConfigを使用したくありません。私はテストレベルでtransacionalスコープを使用していないので、すべてのテストメソッドでテーブルをクリーンアップする必要があります。すべてのテストメソッドがテーブルをクリーンアップする必要がある場合、@ Beforeメソッドでこれを実行したいと思います。 @SqlConfigを使用してすべてのテストメソッドでこれを実行するのは嫌です。 @Beforeより前に実行される@Sqlの動作は間違っていると思います。

18

デフォルトでは、@Sqlを介して実行されるSQLスクリプトはすべて実行されますbefore any @Beforeメソッド。そのため、発生している動作は正しいですが、@SqlexecutionPhase属性を使用して実行フェーズを変更できます(以下の例を参照)。

複数のスクリプトを実行する場合は、@Sqlを使用しても可能です。

したがって、PARAMETROテーブルから削除するclean-parametro.sqlという名前のクリーンアップスクリプトがある場合は、(@BeforeメソッドでJdbcTestUtils.deleteFromTables()を呼び出す代わりに)次のようにテストメソッドに注釈を付けることができます。

@Test
@Sql({"dml-parametro.sql", "clean-parametro.sql"})
public void test() { /* ... */ }

もちろん、dml-parametro.sqlPARAMETROテーブルに値を挿入する場合、クリーンアップスクリプトでそれらの値をすぐに削除することは意味がありません。

@Sqlおよび@SqlConfigは、スクリプト実行の複数レベルの構成を提供することに注意してください。

たとえば、テストの前にテーブルを作成し、テスト後にクリーンアップする場合、Java 8:

@Test
@Sql("create-tables.sql")
@Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD)
public void test() { /* ... */ }

または、Java 6またはJava 7:でコンテナとして@SqlGroupを使用します。

@Test
@SqlGroup({
    @Sql("create-tables.sql"),
    @Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD)
})
public void test() { /* ... */ }

テストが@Transactionalであり、コミットされたデータベースの状態をクリーンアップする場合、次のような新しいトランザクションでクリーンアップSQLスクリプトを実行するようにSpringに指示できます。

@Test
@Sql("insert-test-data.sql")
@Sql(
  scripts = "clean-up.sql",
  executionPhase = AFTER_TEST_METHOD,
  config = @SqlConfig(transactionMode = ISOLATED)
)
public void test() { /* ... */ }

これがあなたにとって物事を明確にすることを願っています!

乾杯、

サム(Spring TestContext Frameworkの作成者)


ノート:

  • AFTER_TEST_METHODExecutionPhaseから静的にインポートされます
  • ISOLATEDTransactionModeから静的にインポートされます
48
Sam Brannen