22 votes

@Avant et @Transactionnel

J'ai

@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(defaultRollback = true, transactionManager = "transactionManager")

   @Before
   @Transactional
   public void mySetup() {
      // insert some records in db
   }

   @After
   @Transactional
   public void myTeardown() {
      // delete some records
   }

   @Test
   @Transactional
   public void testMy() {
      // do stuff
   }

Ma question est la suivante : est-ce que mySetup, testMy et myTeardown s'exécuteront tous dans la même transaction ? Il semble qu'ils le devraient, mais j'obtiens des erreurs étranges qui pourraient suggérer qu'ils s'empiètent les uns sur les autres.

32voto

zagyi Points 6883

Oui, les trois méthodes seront exécutées au cours de la même transaction. Voir la section TestContext Framework/Gestion des transactions dans les documents de référence :

Toutes les méthodes avant (telles que les méthodes annotées avec @Before de JUnit) et toutes les méthodes après (telles que les méthodes annotées avec @After de JUnit) sont exécutées. à l'intérieur une transaction

Ainsi, le @Transactional annotation sur mySetup() y myTeardown() est en quelque sorte redondante, voire trompeuse, car leur caractère transactionnel est déterminé par la méthode de test individuelle en cours d'exécution.

Cela s'explique par le fait que le beforeTestMethod() y afterTestMethod() des rappels de TransactionalTestExecutionListener (responsables du démarrage/de l'achèvement de la transaction) sont exécutées avant les fonctions de JUnit @Before et après la fonction @After respectivement.

11voto

soung Points 163

Quelques changements sont intervenus au printemps 5. D'après le la documentation :

Les méthodes de cycle de vie au niveau de la méthode - par exemple, les méthodes annotées avec l'option @BeforeEach o @AfterEach - sont exécutées dans le cadre d'une transaction gérée par le test.

En revanche, les méthodes de cycle de vie au niveau de la suite et de la classe - par exemple, les méthodes annotées avec l'option de cycle de vie de JUnit Jupiter @BeforeAll o @AfterAll et les méthodes annotées avec la méthode TestNG @BeforeSuite , @AfterSuite , @BeforeClass ou @AfterClass - ne sont pas exécutées dans le cadre d'une transaction gérée par le test .

Si vous devez exécuter du code dans une méthode de cycle de vie au niveau de la suite ou de la classe au sein d'une transaction, vous pouvez injecter un code PlatformTransactionManage r dans votre classe de test et l'utiliser ensuite avec un TransactionTemplate pour la gestion programmatique des transactions t.

3voto

Mohammad Points 61

Si vous annotez vos méthodes @Before et @After avec @Transactional, elles ne seront pas exécutées dans une transaction. Mais si vous utilisez @Transactional pour vos méthodes de test (méthodes qui ont @Test sur elles) ou votre classe de test dans son ensemble, chaque méthode de test sera exécutée dans une transaction différente et les méthodes @Before et @After seront également exécutées dans la même transaction que pour chaque méthode @Test. Pour plus d'illustration, voir ces deux extraits de code :

@Transactional
public class MyTestClass {
    @Before
    public void beforeTest() {
        ...
    }

    @Test
    void testMethod1() {
        ...
    }

    @Test
    void testMethod2() {
        ...
    }

    @After
    public void afterTest() {
        ...
    }
}

Le code ci-dessus s'exécute exactement de la même manière que le code ci-dessous :

public class MyTestClass {
    @Before
    public void beforeTest() {
        ...
    }

    @Test
    @Transactional
    void testMethod1() {
        ...
    }

    @Test
    @Transactional
    void testMethod2() {
        ...
    }

    @After
    public void afterTest() {
        ...
    }
}

Dans ces deux extraits de code, chaque méthode "testMethod1" et "testMethod2" fait l'objet d'une transaction différente. De même, les méthodes "beforeMethod" et "afterMethod" seraient exécutées respectivement dans la transaction de chaque méthode de test.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X