Spring @ContextConfiguration如何把xml的正确位置

在我们的项目中,我们正在写一个testing来检查控制器是否返回正确的模型视图

@Test public void controllerReturnsModelToOverzichtpage() { ModelAndView modelView = new ModelAndView(); KlasoverzichtController controller = new KlasoverzichtController(); modelView = controller.showOverzicht(); assertEquals("Klasoverzichtcontroller returns the wrong view ", modelView.getViewName(), "overzicht"); } 

这将返回exceptionnull。

我们现在正在configuration@contextconfiguration,但我们不知道如何加载位于src \ main \ webapp \ root \ WEB-INF \ root-context.xml中的正确的xml

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class TestOverzichtSenario{ .... 

这个文档不够清楚

任何build议如何确保contextannotation加载正确的XML?

编辑v2

我将configuration.xml文件从webINF文件夹复制到

 src\main\resources\be\..a bunch of folders..\configuration\*.xml 

并将webinf中的web.xml改为

 <param-name>contextConfigLocation</param-name> <param-value> classpath*:configuration/root-context.xml classpath*:configuration/applicationContext-security.xml </param-value> 

现在得到错误

 org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341) org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143) org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178) org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149) org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124) org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:93) org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467) org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458) org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339) org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306) org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127) javax.servlet.GenericServlet.init(GenericServlet.java:212) com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:80) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:379) java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) java.lang.Thread.run(Unknown Source) 

这就是不把configuration放入webapp的原因。

据我所知,没有好的方法来访问unit testing中的webapp文件夹中的文件。 你可以把你的configuration放到src/main/resources ,这样你就可以从你的unit testing(如文档中所述)以及从webapp(在contextConfigLocation使用classpath:前缀)访问它。

也可以看看:

  • 4.7应用程序上下文和资源path

我们的testing看起来像这样(使用Maven和Spring 3.1):

 @ContextConfiguration ( { "classpath:beans.xml", "file:src/main/webapp/WEB-INF/spring/applicationContext.xml", "file:src/main/webapp/WEB-INF/spring/dispatcher-data-servlet.xml", "file:src/main/webapp/WEB-INF/spring/dispatcher-servlet.xml" } ) @RunWith(SpringJUnit4ClassRunner.class) public class CCustomerCtrlTest { @Resource private ApplicationContext m_oApplicationContext; @Autowired private RequestMappingHandlerAdapter m_oHandlerAdapter; @Autowired private RequestMappingHandlerMapping m_oHandlerMapping; private MockHttpServletRequest m_oRequest; private MockHttpServletResponse m_oResp; private CCustomerCtrl m_oCtrl; // more code .... } 

这是我想的一个特定于Maven的问题。 Maven不会将文件form /src/main/resources复制到目标testing文件夹。 你将不得不通过configuration资源插件,如果你绝对想要这样做。

更简单的方法是将testing特定的上下文定义放在/src/test/resources目录中并通过以下方式加载:

 @ContextConfiguration(locations = { "classpath:mycontext.xml" }) 

简单的解决scheme是

 @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext.xml" }) 

从春季论坛

我们用:

 @ContextConfiguration(locations="file:WebContent/WEB-INF/spitterMVC-servlet.xml") 

该项目是一个eclipsedynamicweb项目,那么path是:

 {project name}/WebContent/WEB-INF/spitterMVC-servlet.xml 

假设您要创build一个独立于app-context.xml进行testing的test-context.xml,将test-context.xml放在/ src / test / resources下。 在testing类中,在类定义的顶部有@ContextConfiguration注解。

 @ContextConfiguration(locations = "/test-context.xml") public class MyTests { ... } 

Spring文档上下文pipe理

从以下位置加载文件: {project}/src/main/webapp/WEB-INF/spring-dispatcher-servlet.xml

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring-dispatcher-servlet.xml" }) @WebAppConfiguration public class TestClass { @Test public void test() { // test definition here.. } } 

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {“/Beans.xml”})public class DemoTest {}

有时候,这可能是一些非常简单的事情,比如在test-classses文件夹中由于某些清理而丢失资源文件。