java - Difference between @ContextConfiguration with "locations" or same config with "classes" and @ImportResource -
i have java spring mvc application contains unit test set this:
// configuration class. @configuration @importresource({ "classpath:configuration/applicationcontext.xml", "classpath:configuration/applicationcontext2.xml", "classpath:configuration/applicationcontext3.xml" }) public class unittestconfiguration { } // unit test. @runwith(springjunit4classrunner.class) @contextconfiguration(classes = {unittestconfiguration.class}) @webappconfiguration() public class auditrecordcontrollertest { // tests } the unit test works fine way. however, if change unit test's annotations following (while leaving rest of code same):
// unit test. @runwith(springjunit4classrunner.class) @contextconfiguration(locations = { "classpath:configuration/applicationcontext.xml", "classpath:configuration/applicationcontext2.xml", "classpath:configuration/applicationcontext3.xml" }) @webappconfiguration() public class myunittest { // tests. } ...then test fails run properly, giving me error posted below. makes difference? (evidently erroneously) assumed both setups 2 alternatives should have same outcome, apparently done different causes latter 1 fail.
can explain difference between using @contextconfiguration "locations" , using "classes" reference configuration class loading exact same locations?
exception occurs:
java.lang.illegalstateexception: failed load applicationcontext @ org.springframework.test.context.cacheawarecontextloaderdelegate.loadcontext(cacheawarecontextloaderdelegate.java:99) @ org.springframework.test.context.defaulttestcontext.getapplicationcontext(defaulttestcontext.java:101) @ org.springframework.test.context.web.servlettestexecutionlistener.setuprequestcontextifnecessary(servlettestexecutionlistener.java:161) @ org.springframework.test.context.web.servlettestexecutionlistener.preparetestinstance(servlettestexecutionlistener.java:101) @ org.springframework.test.context.testcontextmanager.preparetestinstance(testcontextmanager.java:324) @ org.springframework.test.context.junit4.springjunit4classrunner.createtest(springjunit4classrunner.java:213) @ org.springframework.test.context.junit4.springjunit4classrunner$1.runreflectivecall(springjunit4classrunner.java:290) @ org.junit.internal.runners.model.reflectivecallable.run(reflectivecallable.java:12) @ org.springframework.test.context.junit4.springjunit4classrunner.methodblock(springjunit4classrunner.java:292) @ org.springframework.test.context.junit4.springjunit4classrunner.runchild(springjunit4classrunner.java:233) @ org.springframework.test.context.junit4.springjunit4classrunner.runchild(springjunit4classrunner.java:87) @ 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:71) @ org.junit.runners.parentrunner.run(parentrunner.java:309) @ org.springframework.test.context.junit4.springjunit4classrunner.run(springjunit4classrunner.java:176) @ org.junit.runner.junitcore.run(junitcore.java:160) @ com.intellij.junit4.junit4ideatestrunner.startrunnerwithargs(junit4ideatestrunner.java:77) @ com.intellij.rt.execution.junit.junitstarter.preparestreamsandstart(junitstarter.java:195) @ com.intellij.rt.execution.junit.junitstarter.main(junitstarter.java:63) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ com.intellij.rt.execution.application.appmain.main(appmain.java:120) caused by: org.springframework.beans.factory.parsing.beandefinitionparsingexception: configuration problem: duplicate <global-method-security> detected. offending resource: class path resource [configuration/applicationcontext.xml] @ org.springframework.beans.factory.parsing.failfastproblemreporter.error(failfastproblemreporter.java:70) @ org.springframework.beans.factory.parsing.readercontext.error(readercontext.java:85) @ org.springframework.beans.factory.parsing.readercontext.error(readercontext.java:72) @ org.springframework.security.config.method.globalmethodsecuritybeandefinitionparser.registeradvisor(globalmethodsecuritybeandefinitionparser.java:382) @ org.springframework.security.config.method.globalmethodsecuritybeandefinitionparser.parse(globalmethodsecuritybeandefinitionparser.java:259) @ org.springframework.security.config.securitynamespacehandler.parse(securitynamespacehandler.java:106) @ org.springframework.beans.factory.xml.beandefinitionparserdelegate.parsecustomelement(beandefinitionparserdelegate.java:1424) @ org.springframework.beans.factory.xml.beandefinitionparserdelegate.parsecustomelement(beandefinitionparserdelegate.java:1414) @ org.springframework.beans.factory.xml.defaultbeandefinitiondocumentreader.parsebeandefinitions(defaultbeandefinitiondocumentreader.java:187) @ org.springframework.beans.factory.xml.defaultbeandefinitiondocumentreader.doregisterbeandefinitions(defaultbeandefinitiondocumentreader.java:141) @ org.springframework.beans.factory.xml.defaultbeandefinitiondocumentreader.registerbeandefinitions(defaultbeandefinitiondocumentreader.java:110) @ org.springframework.beans.factory.xml.xmlbeandefinitionreader.registerbeandefinitions(xmlbeandefinitionreader.java:508) @ org.springframework.beans.factory.xml.xmlbeandefinitionreader.doloadbeandefinitions(xmlbeandefinitionreader.java:391) @ org.springframework.beans.factory.xml.xmlbeandefinitionreader.loadbeandefinitions(xmlbeandefinitionreader.java:335) @ org.springframework.beans.factory.xml.xmlbeandefinitionreader.loadbeandefinitions(xmlbeandefinitionreader.java:303) @ org.springframework.beans.factory.support.abstractbeandefinitionreader.loadbeandefinitions(abstractbeandefinitionreader.java:180) @ org.springframework.beans.factory.support.abstractbeandefinitionreader.loadbeandefinitions(abstractbeandefinitionreader.java:216) @ org.springframework.beans.factory.support.abstractbeandefinitionreader.loadbeandefinitions(abstractbeandefinitionreader.java:187) @ org.springframework.context.annotation.configurationclassbeandefinitionreader.loadbeandefinitionsfromimportedresources(configurationclassbeandefinitionreader.java:313) @ org.springframework.context.annotation.configurationclassbeandefinitionreader.loadbeandefinitionsforconfigurationclass(configurationclassbeandefinitionreader.java:138) @ org.springframework.context.annotation.configurationclassbeandefinitionreader.loadbeandefinitions(configurationclassbeandefinitionreader.java:116) @ org.springframework.context.annotation.configurationclasspostprocessor.processconfigbeandefinitions(configurationclasspostprocessor.java:324) @ org.springframework.context.annotation.configurationclasspostprocessor.postprocessbeandefinitionregistry(configurationclasspostprocessor.java:243) @ org.springframework.context.support.postprocessorregistrationdelegate.invokebeandefinitionregistrypostprocessors(postprocessorregistrationdelegate.java:254) @ org.springframework.context.support.postprocessorregistrationdelegate.invokebeanfactorypostprocessors(postprocessorregistrationdelegate.java:94) @ org.springframework.context.support.abstractapplicationcontext.invokebeanfactorypostprocessors(abstractapplicationcontext.java:609) @ org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:464) @ org.springframework.test.context.web.abstractgenericwebcontextloader.loadcontext(abstractgenericwebcontextloader.java:132) @ org.springframework.test.context.web.abstractgenericwebcontextloader.loadcontext(abstractgenericwebcontextloader.java:59) @ org.springframework.test.context.support.abstractdelegatingsmartcontextloader.delegateloading(abstractdelegatingsmartcontextloader.java:100) @ org.springframework.test.context.support.abstractdelegatingsmartcontextloader.loadcontext(abstractdelegatingsmartcontextloader.java:250) @ org.springframework.test.context.cacheawarecontextloaderdelegate.loadcontextinternal(cacheawarecontextloaderdelegate.java:64) @ org.springframework.test.context.cacheawarecontextloaderdelegate.loadcontext(cacheawarecontextloaderdelegate.java:91) ... 28 more
it turns out @configuration type of specialized @component. means if it's found during component scan, xml configuration contains loaded. caused error in second setup:
applicationcontext.xmlcontained line<context:component-scan base-package="com.epathlogic.pole" />.- the component scan found
unittestconfigurationbecause annotated@configuration, xml configuration defined automatically applied. - since config defined
unittestconfigurationsame being loaded unit test, started loading duplicates caused error.
when removed @configuration unittestconfiguration, worked expected. wasn't until after removed 2 setups indeed alternatives same result.
Comments
Post a Comment