2010-10-27 19 views
1

J'ai un test JUnit4 qui étend AbstractTransactionalJUnit4SpringContextTests. J'ai un objet métier que j'ai marqué comme unité de travail avec @Transactional. L'unité de travail met à jour la base de données qu'un utilisateur a été averti & puis tente de leur envoyer un message de notification. J'ai configuré la méthode à restaurer pour une MailException (api de courrier simple de printemps) et mocké un MailSender pour lancer une SendMailException quand il est appelé pour valider la fonctionnalité d'annulation. Dans mon test d'unité, cependant, la transaction n'est pas annulée. J'essaie de déterminer si elle participe à la transaction en cours d'ouverture pour ma méthode de test, car la méthode de test ne l'est pas. pas commettre ou annulé. La méthode qui représente une unité de travail est configurée pour requérir une nouvelle transaction, et j'ai essayé de configurer deux gestionnaires de transactions dans spring config et de spécifier que le cas de test utilise le deuxième gestionnaire de transactions. Peu importe, quand je vérifie les données dans la méthode de test unitaire, elle reste modifiée même si elle aurait dû être annulée par le code d'application rencontrant l'exception d'envoi de courrier.Test d'intégration qui simule la condition Exceptional/Rollback avec AbstractTransactionalJUnit4SpringContextTests

un aperçu serait génial.

Répondre

0

Je l'ai utilisé un baseclass avec annotations suivantes et tendis test-classes réelles de celui-ci:

@ContextConfiguration(locations="classpath:applicationContext-test.xml") 
@TransactionConfiguration(transactionManager="txManager", defaultRollback=true) 
@Transactional 
public abstract class IntegrationTestBase extends AbstractTransactionalJUnit4SpringContextTests 
{ 
    //...Some setup stuff with @Before 
} 

Les test-classes étendant cette classe sont marqués par @Transactional -annotation, mais je ne suis pas sûr que c'est même nécessaire. Quoi qu'il en soit, cela semble faire l'affaire, car le journal indique que l'annulation se produit après chaque test, et les changements effectués dans une méthode de test ne sont pas visibles dans un autre.

15: 53: 10564 (6923) [INFO] org.springframework.test.context.transaction.TransactionalTestExecutionListener: 280 - transaction avant laminé après l'exécution du test de contexte de test [[TestContext @ 6dadfbe3 TestClass = org.some.SomeTestClass, les emplacements = array [ 'classpath: applicationContext-test.xml'], testInstance = [email protected], testMethod = testerQuelqueChose @ SomeTestClass, TestException = [null]] ]

Voir aussi @Transactional -annotations attributs rollbackFor, rollbackForClassName, noRollbackFor & noRollbackForClassName