java - Unit tests @Transactional - Could not commit JPA transaction; transaction marked as rollback only -


i writing junit tests spring app. 1 of scenarios getting exception

could not commit jpa transaction; nested exception javax.persistence.rollbackexception: transaction marked rollbackonly.

i have read other questions , answers , did not help. scenario having problems pretty simple. want check unique constraint of entity field enforced. create 2 entities same field , expect constraint violation exception. calling method marked @transactional, because want whole thing rollback if exception occurs.

this code:

@runwith(springjunit4classrunner.class) @springapplicationconfiguration(classes = deadlinesapplication.class) @rollback(value = false) public class userhelpertest {     @autowired     private userhelper userhelper;      @test(expected = dataintegrityviolationexception.class)     @transactional     public void uniqueusername() throws nullparameterexception {         user user = userhelper.createuser("uniq1", "password", null, null);         user user2 = userhelper.createuser("uniq2", "password", null, null);         user user3 = userhelper.createuser("uniq2", "password", null, null);     } 

userhelper class called:

@service public class userhelper {     @autowired     private userdao userdao;       public user createuser(...) throws nullparameterexception {         user newuser = new user(username, ...);          userdao.save(newuser);          return newuser;     } 

userdao's save() method subsequently calls save() on userrepository:

@repository public interface userrepository extends crudrepository<user, long> {     public user findbyusername(string username); } 

the place @transactional test method. needs there, because in separate test method lazy loading many-to-many relation , needs happen inside 1 transaction.

can see wrong code?

edit: error stacktrace

org.springframework.transaction.transactionsystemexception: not commit jpa transaction; nested exception javax.persistence.rollbackexception: transaction marked rollbackonly      @ org.springframework.orm.jpa.jpatransactionmanager.docommit(jpatransactionmanager.java:526)     @ org.springframework.transaction.support.abstractplatformtransactionmanager.processcommit(abstractplatformtransactionmanager.java:761)     @ org.springframework.transaction.support.abstractplatformtransactionmanager.commit(abstractplatformtransactionmanager.java:730)     @ org.springframework.test.context.transaction.transactioncontext.endtransaction(transactioncontext.java:128)     @ org.springframework.test.context.transaction.transactionaltestexecutionlistener.aftertestmethod(transactionaltestexecutionlistener.java:224)     @ org.springframework.test.context.testcontextmanager.aftertestmethod(testcontextmanager.java:313)     @ org.springframework.test.context.junit4.statements.runaftertestmethodcallbacks.evaluate(runaftertestmethodcallbacks.java:94)     @ org.springframework.test.context.junit4.statements.springrepeat.evaluate(springrepeat.java:84)     @ org.junit.runners.parentrunner.runleaf(parentrunner.java:325)     @ org.springframework.test.context.junit4.springjunit4classrunner.runchild(springjunit4classrunner.java:254)     @ org.springframework.test.context.junit4.springjunit4classrunner.runchild(springjunit4classrunner.java:89)     @ org.junit.runners.parentrunner$3.run(parentrunner.java:290)     @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:71)     @ org.junit.runners.parentrunner.runchildren(parentrunner.java:288)     @ org.junit.runners.parentrunner.access$000(parentrunner.java:58)     @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:268)     @ org.springframework.test.context.junit4.statements.runbeforetestclasscallbacks.evaluate(runbeforetestclasscallbacks.java:61)     @ org.springframework.test.context.junit4.statements.runaftertestclasscallbacks.evaluate(runaftertestclasscallbacks.java:70)     @ org.junit.runners.parentrunner.run(parentrunner.java:363)     @ org.springframework.test.context.junit4.springjunit4classrunner.run(springjunit4classrunner.java:193)     @ org.junit.runner.junitcore.run(junitcore.java:137)     @ com.intellij.junit4.junit4ideatestrunner.startrunnerwithargs(junit4ideatestrunner.java:119)     @ com.intellij.junit4.junit4ideatestrunner.startrunnerwithargs(junit4ideatestrunner.java:42)     @ com.intellij.rt.execution.junit.junitstarter.preparestreamsandstart(junitstarter.java:234)     @ com.intellij.rt.execution.junit.junitstarter.main(junitstarter.java:74)     @ sun.reflect.nativemethodaccessorimpl.invoke0(native method)     @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     @ java.lang.reflect.method.invoke(method.java:483)     @ com.intellij.rt.execution.application.appmain.main(appmain.java:144) caused by: javax.persistence.rollbackexception: transaction marked rollbackonly     @ org.hibernate.jpa.internal.transactionimpl.commit(transactionimpl.java:74)     @ org.springframework.orm.jpa.jpatransactionmanager.docommit(jpatransactionmanager.java:517)     ... 29 more  2016-03-26 20:53:52.913  info 2448 --- [       thread-3] s.c.a.annotationconfigapplicationcontext : closing org.springframework.context.annotation.annotationconfigapplicationcontext@20deea7f: startup date [sat mar 26 20:53:44 cet 2016]; root of context hierarchy 2016-03-26 20:53:52.924  info 2448 --- [       thread-3] j.localcontainerentitymanagerfactorybean : closing jpa entitymanagerfactory persistence unit 'default' 


Comments