2014-05-13 4 views
0

Disons que nous avons le prochain test:Comment faire pour annuler une transaction après la classe (en utilisant TestNg et Spring)?

@ContextConfiguration(classes = {MyDaoContext.class}) 
public class MyDaoTest extends AbstractTransactionalTestNGSpringContextTests { 

@Autowired 
private MyDao dao; 

@Test 
public void insertDataTest() { 
    // insert data here and test something 
} 

@Test(dependsOnMethods = "insertDataTest") 
public void modifyPreviouslyInsertedDataTest() { 
    // get previously inserted data and test something 
} 
} 

Second test tombera parce que quand nous avons terminé premier test, les données insérées sont partis. Existe-t-il un moyen d'annuler une transaction une fois que tous les tests ont terminé leur travail?

Répondre

3

Chaque test s'exécute dans sa propre transaction et les rollbacks à la fin. Vous pouvez régler cela en ajoutant @Rollback(false) à votre premier test.

Le problème est maintenant que la transaction de insertDataTest est terminée, donc vous devriez supprimer ce qu'il a créé manuellement. Pour ce faire, la classe que vous étendez a plusieurs méthodes d'utilitaire telles que deleteFromTables ou deleteFromTableWhere.

Cela devrait aller idéalement dans un @AfterClass ou quelque chose.

Mais ce n'est pas ce que je ferais. Je voudrais factoriser les données qui sont insérées par insertDataTest dans un utilitaire partagé. De cette façon, vous pouvez l'appeler de nouveau dans votre deuxième test et supprimer le dependsOnMethods. Avoir une telle dépendance n'est pas recommandé car vous ne pouvez pas exécuter ce test de manière isolée.

+0

Y at-il un moyen d'utiliser le printemps pour faire ce travail pour moi? (deleteFromTables ou deleteFromTableWhere) – nikopol86

+0

Eh bien, vous utilisez déjà Spring lorsque vous invoquez ces méthodes. Que faites-vous après exaclty? –

+0

Salut, "factoriser les données insérées par insertDataTest dans un utilitaire partagé". S'il vous plaît expliquer plus à ce sujet – Tiina

2

Effectuez les opérations suivantes (qui travaillerait en JUnit, je ne suis pas sûr TestBG)

@ContextConfiguration(classes = {MyDaoContext.class}) 
public class MyDaoTest extends AbstractTransactionalTestNGSpringContextTests { 

    @Autowired 
    private MyDao dao; 

    @Test 
    @Rollback(false) 
    public void insertDataTest() { 
     // insert data here and test something 
    } 

    @Test(dependsOnMethods = "insertDataTest") 
    public void modifyPreviouslyInsertedDataTest() { 
     // get previously inserted data and test something 
    } 
} 

Dans ce cas, bien sûr, vous devez supprimer les données de la première méthode manuelle

+0

Merci pour la réponse. Mais si j'ajoute @Rollback (false), les données resteront dans la base de données une fois tous les tests terminés. J'ai besoin de données dans la base de données seulement pendant le test et je dois annuler toutes les insertions à la fin des tests. – nikopol86

+0

Oui, vous devez supprimer les données manuellement – geoand

Questions connexes