Sunday 15 July 2012

java - @After method being run first by JUnit -



java - @After method being run first by JUnit -

i running unusual issue junit test case: @after method invoked first junit.

here abstract class utilize test:

@runwith(springjunit4classrunner.class) @springapplicationconfiguration(classes = { testserviceplusrepositoryintegrationconfiguration.class }) @activeprofiles(profiles.test) @transactional public abstract class abstractserviceplusrepositoryintegrationtest { }

here problematic test case:

public class advertisementservicesecuritytest extends abstractserviceplusrepositoryintegrationtest { ... @before public void setup() { advertisement = advertisementfactory.createadvertisement(owner_of_advertisement_email); impersonator = memberfactory.createmember(impersonator_email, role.role_basic_childcareworker); when(geolocationservicemock.retrieveaddressfromreference("valid-reference")).thenreturn(new address()); } @after public void teardown() {//executed first! advertisementfactory.deleteadvertisement(advertisement); memberfactory.deletemember(impersonator); } ... @test(expected = accessdeniedexception.class) @withuserdetails(impersonator_email) public void deleteadvertisementbyidwithinvalidmember() { advertisementservice.deleteadvertisement(advertisement.getid()); }

what cause @after method run first? fyi, don't utilize junit 3.

here total source code test case: https://gist.github.com/balteo/e8c2ea96db22d3f9c88e

it appears exception raised in @before method causing not complete:

2014-11-08 13:39:12.169 warn 4513 --- [ main] o.s.test.context.testcontextmanager : caught exception while allowing testexecutionlistener [org.springframework.security.test.context.support.withsecuritycontexttestexecutionlistener@44c03695] process 'before' execution of test method [public void com.bignibou.it.service.advertisement.advertisementservicesecuritytest.deleteadvertisementbyidwithinvalidmember()] test instance [com.bignibou.it.service.advertisement.advertisementservicesecuritytest@49438269] java.lang.illegalstateexception: unable create securitycontext using @org.springframework.security.test.context.support.withuserdetails(value=joe.hacker@gmail.com) @ org.springframework.security.test.context.support.withsecuritycontexttestexecutionlistener.createsecuritycontext(withsecuritycontexttestexecutionlistener.java:84) @ org.springframework.security.test.context.support.withsecuritycontexttestexecutionlistener.beforetestmethod(withsecuritycontexttestexecutionlistener.java:60) @ org.springframework.test.context.testcontextmanager.beforetestmethod(testcontextmanager.java:249) @ org.springframework.test.context.junit4.statements.runbeforetestmethodcallbacks.evaluate(runbeforetestmethodcallbacks.java:72) @ org.junit.internal.runners.statements.runafters.evaluate(runafters.java:27) @ org.springframework.test.context.junit4.statements.runaftertestmethodcallbacks.evaluate(runaftertestmethodcallbacks.java:82) @ org.springframework.test.context.junit4.statements.springrepeat.evaluate(springrepeat.java:73) @ org.junit.runners.parentrunner.runleaf(parentrunner.java:271) @ org.springframework.test.context.junit4.springjunit4classrunner.runchild(springjunit4classrunner.java:217) @ org.springframework.test.context.junit4.springjunit4classrunner.runchild(springjunit4classrunner.java:83) @ org.junit.runners.parentrunner$3.run(parentrunner.java:238) @ org.junit.runners.parentrunner$1.schedule(parentrunner.java:63) @ org.junit.runners.parentrunner.runchildren(parentrunner.java:236) @ org.junit.runners.parentrunner.access$000(parentrunner.java:53) @ org.junit.runners.parentrunner$2.evaluate(parentrunner.java:229) @ org.springframework.test.context.junit4.statements.runbeforetestclasscallbacks.evaluate(runbeforetestclasscallbacks.java:61) @ org.springframework.test.context.junit4.statements.runaftertestclasscallbacks.evaluate(runaftertestclasscallbacks.java:68) @ org.junit.runners.parentrunner.run(parentrunner.java:309) @ org.springframework.test.context.junit4.springjunit4classrunner.run(springjunit4classrunner.java:163) @ org.eclipse.jdt.internal.junit4.runner.junit4testreference.run(junit4testreference.java:50) @ org.eclipse.jdt.internal.junit.runner.testexecution.run(testexecution.java:38) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.runtests(remotetestrunner.java:459) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.runtests(remotetestrunner.java:675) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.run(remotetestrunner.java:382) @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.main(remotetestrunner.java:192) caused by: org.springframework.security.core.userdetails.usernamenotfoundexception: username: joe.hacker@gmail.com not found! @ com.bignibou.service.security.memberuserdetailsservice.loaduserbyusername(memberuserdetailsservice.java:22) @ org.springframework.security.test.context.support.withuserdetailssecuritycontextfactory.createsecuritycontext(withuserdetailssecuritycontextfactory.java:48) @ org.springframework.security.test.context.support.withuserdetailssecuritycontextfactory.createsecuritycontext(withuserdetailssecuritycontextfactory.java:36) @ org.springframework.security.test.context.support.withsecuritycontexttestexecutionlistener.createsecuritycontext(withsecuritycontexttestexecutionlistener.java:82) ... 24 mutual frames omitted teardown

using spring's @beforetransaction see javadocs here allowed test run , pass:

@beforetransaction public void setup() { system.out.println("setup"); advertisement = advertisementfactory.createadvertisement(owner_of_advertisement_email); impersonator = memberfactory.createmember(impersonator_email, role.role_basic_childcareworker); when(geolocationservicemock.retrieveaddressfromreference("valid-reference")).thenreturn(new address()); } @aftertransaction public void teardown() { system.out.println("teardown"); advertisementfactory.deleteadvertisement(advertisement); memberfactory.deletemember(impersonator); }

java junit junit4 spring-junit

No comments:

Post a Comment