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 :

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);
	}
 
	...
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
 
@Service
public class MonService {
 
	@Autowired
	private MonDao monDao;
 
	public void createBean(MonBean bean) {
		monDao.createBean(bean);
	}
 
	...
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
13
 
@Repository
public class MonDao {
 
	@PersistenceContext
	private EntityManager entityManager;
 
	@Transactional
	public void createBean(MonBean bean) {
		entityManager.persist(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.

Plus concrètement, si je met un log dans le DAO, comme suit :

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 la trace suivante :

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}'}
]
J'obtiens bien une trace équivalente quand j'ajoute des logs dans le service.

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 :

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
Si quelqu'un pouvait m’éclairer.

Merci d'avance.