Bonjour à tous,
J'ai un petit problème que je ne comprend pas, et pour lequel j'aurais bien aimé un peu d'aide.
Pour commencer, j'ai un test :
Ce test appelle donc un service (passe plat ici) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 @SpringApplicationContext("test-applicationContext.xml") @DataSet public class MonServiceTest extends UnitilsJUnit4 { @SpringBeanByName private MonService monService; @Test(expected = ConstraintViolationException.class) public void testCreateVide() { final MonBean beanVide = new MonBean(); monService.createBean(beanVide); } ...
Et donc le DAO, très simple lui aussi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @Service public class MonService { @Autowired private MonDao monDao; public void createBean(MonBean bean) { monDao.createBean(bean); } ...
Le test est conçu pour échouer (d'où le expected) puisque j'utilise un bean vide. Les contraintes sur les champs du bean font que ça doit planter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 @Repository public class MonDao { @PersistenceContext private EntityManager entityManager; @Transactional public void createBean(MonBean bean) { entityManager.persist(bean); } ...
Plus concrètement, si je met un log dans le DAO, comme suit :
J'obtiens bien la trace suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 @Transactional public void createSite(Site newSite) { try { entityManager.persist(newSite); } catch (RuntimeException e) { System.out.println("***DAO***"+e.getClass()); logger.error(e.getMessage(), e); throw e; } }
J'obtiens bien une trace équivalente quand j'ajoute des logs dans le service.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ***DAO***class javax.validation.ConstraintViolationException ERROR: com.moi.MonDao - Validation failed for classes [com.moi.MonBean] during persist time for groups [javax.validation.groups.Default, ] List of constraint violations:[ ConstraintViolationImpl{interpolatedMessage='ne peut pas être vide', propertyPath=name, rootBeanClass=class com.moi.MonBean, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'} ConstraintViolationImpl{interpolatedMessage='Au moins une langue doit être sélectionnées', propertyPath=langs, rootBeanClass=class com.moi.MonBean, messageTemplate='{com.moi.monbean.checklangs}'} ConstraintViolationImpl{interpolatedMessage='ne peut pas être vide', propertyPath=visualId, rootBeanClass=class com.moi.MonBean, messageTemplate='{org.hibernate.validator.constraints.NotBlank.message}'} ]
Par contre, mon test JUnit (lancé depuis Eclipse) est rouge. J'ai une TransactionSystemException alors que je devrais avoir une ConstraintViolationException. Et je ne comprend pas comment/pourquoi la TransactionSystemException arrive...
J'ai la trace suivante dans JUnit :
Si quelqu'un pouvait m’éclairer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) at org.unitils.database.transaction.impl.DefaultUnitilsTransactionManager.commit(DefaultUnitilsTransactionManager.java:137) at org.unitils.database.DatabaseModule.commitTransaction(DatabaseModule.java:421) at org.unitils.database.DatabaseModule.endTransactionForTestMethod(DatabaseModule.java:396) at org.unitils.database.DatabaseModule$DatabaseTestListener.afterTestTearDown(DatabaseModule.java:540) at org.unitils.core.Unitils$UnitilsTestListener.afterTestTearDown(Unitils.java:315) at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:159) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95) at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:61) at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:44) at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:62) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:68) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512) ... 23 more
Merci d'avance.
Partager