web-dev-qa-db-fra.com

Comment exécuter @Sql avant une méthode @Before

J'essaie de combiner les annotations suivantes:

org.springframework.test.context.jdbc.Sql et org.junit.Before

Comme le code suivant:

@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");
}

Le code de la méthode @Before s'exécute après le script "dml-parametro.sql" dans l'annotation @Sql.

Est-il juste de faire cela?

Pour résoudre ce problème, j'utilise @After en place que @Before, mais je voudrais supprimer les tables avant l'exécution du test, pas après.

Je ne voudrais pas utiliser @SqlConfig. Je n'utilise pas la portée transacional au niveau du test, j'ai donc besoin de nettoyer mes tables dans chaque méthode de test. Si chaque méthode de test doit nettoyer des tables, je voudrais le faire dans la méthode @Before. Je n'aimerais pas le faire dans chaque méthode de test avec @SqlConfig. Je pense que le comportement de @Sql à exécuter avant que @Before est faux.

18

Par défaut, tous les scripts SQL exécutés via @Sql Seront exécutés avant toutes les méthodes @Before. Le comportement que vous rencontrez est donc correct, mais vous pouvez modifier la phase d'exécution via l'attribut executionPhase dans @Sql (Voir l'exemple ci-dessous).

Si vous souhaitez exécuter plusieurs scripts, cela est également possible via @Sql.

Donc, si vous avez un script de nettoyage nommé clean-parametro.sql Qui supprime de la table PARAMETRO, vous pouvez annoter votre méthode de test comme suit (au lieu d'invoquer JdbcTestUtils.deleteFromTables() dans votre @Before Méthode).

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

Bien sûr, si dml-parametro.sql Insère des valeurs dans la table PARAMETRO, il n'est probablement pas logique de supprimer immédiatement ces valeurs dans le script de nettoyage.

Veuillez noter que @Sql Et @SqlConfig Fournissent plusieurs niveaux de configuration pour l'exécution du script.

Par exemple, si vous souhaitez créer des tables avant votre test et nettoyer après votre test, vous pouvez faire quelque chose comme ceci sur Java 8:

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

Ou utilisez @SqlGroup Comme conteneur sur Java 6 ou Java 7:

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

Si vos tests sont @Transactional Et que vous souhaitez nettoyer l'état de la base de données validée, vous pouvez demander à Spring d'exécuter votre script SQL de nettoyage dans une nouvelle transaction comme celle-ci:

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

J'espère que cela clarifie les choses pour vous!

À votre santé,

Sam (auteur du Spring TestContext Framework)


Remarques:

  • AFTER_TEST_METHOD Est importé de manière statique depuis ExecutionPhase
  • ISOLATED est importé statiquement de TransactionMode
48
Sam Brannen