126 votes

Annulation de la transaction après @Test

Tout d'abord, j'ai trouvé beaucoup de fils de discussion sur StackOverflow à ce sujet, mais aucun d'entre eux ne m'a vraiment aidé, donc désolé de poser une question qui pourrait faire double emploi.

J'exécute des tests JUnit en utilisant spring-test, mon code ressemble à ceci

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {})
public class StudentSystemTest {

    @Autowired
    private StudentSystem studentSystem;

    @Before
    public void initTest() {
    // set up the database, create basic structure for testing
    }

    @Test
    public void test1() {
    }    
    ...  
}

Mon problème est que je veux que mes tests n'influencent PAS les autres tests. J'aimerais donc créer quelque chose comme un rollback pour chaque test. J'ai beaucoup cherché pour cela, mais je n'ai rien trouvé jusqu'à présent. J'utilise Hibernate et MySql pour cela.

2voto

Johan Sjöberg Points 20759

Vous devez exécuter votre test avec un contexte Spring et un gestionnaire de transactions, par exemple,

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {"/your-applicationContext.xml"})
@TransactionConfiguration(transactionManager="txMgr")
public class StudentSystemTest {

     @Test
     public void testTransactionalService() {
         // test transactional service
     }

     @Test
     @Transactional
     public void testNonTransactionalService() {
         // test non-transactional service
     }
}

Voir chapitre 3.5.8. Transaction Management de la référence Spring pour plus de détails.

-5voto

DwD Points 31

Vous pouvez désactiver le Rollback :

@TransactionConfiguration(defaultRollback = false)

Exemple :

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@Transactional
@TransactionConfiguration(defaultRollback = false)
public class Test {
    @PersistenceContext
    private EntityManager em;

    @org.junit.Test
    public void menge() {
        PersistentObject object = new PersistentObject();
        em.persist(object);
        em.flush();
    }
}

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