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.xml contained line <context:component-scan base-package="com.epathlogic.pole" />.
  • the component scan found unittestconfiguration because annotated @configuration , xml configuration defined automatically applied.
  • since config defined unittestconfiguration same 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