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
Post a Comment