Spring @ContextConfiguration, как установить правильное местоположение для xml
В нашем проекте мы выписываем тест, чтобы проверить, вернул ли контроллер правильное представление модели
@Test
public void controllerReturnsModelToOverzichtpage()
{
ModelAndView modelView = new ModelAndView();
KlasoverzichtController controller = new KlasoverzichtController();
modelView = controller.showOverzicht();
assertEquals("Klasoverzichtcontroller returns the wrong view ", modelView.getViewName(), "overzicht");
}
Это возвращает исключение null.
Теперь мы настраиваем @contextconfiguration, но мы не знаем, как загрузить правильный xml, который находится в src\main\webapp\root\WEB-INF\root-context.xml
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TestOverzichtSenario{
....
Эта документация недостаточно ясна для понимания
Любое предложение о том, как убедиться, что contextannotation загружает правильный xml?
Изменить v2
Я скопировал файлы конфигурации .xml из папки webINF в
src\main\resources\be\..a bunch of folders..\configuration\*.xml
и изменил web.xml в webinf на
<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)
Ответы
Ответ 1
Это причина, по которой не ставить конфигурацию в webapp
.
Насколько я знаю, нет хороших способов доступа к файлам в папке webapp
из модульных тестов. Вы можете поместить свою конфигурацию в src/main/resources
вместо этого, чтобы вы могли получить к ней доступ из своих модульных тестов (как описано в документах), а также из webapp (используя префикс classpath:
в contextConfigLocation
).
См. также:
Ответ 2
Наши тесты выглядят так (используя 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 ....
}
Ответ 3
Это определенная проблема maven, я думаю. Maven не копирует файлы /src/main/resources
в папку целевого теста. Вам нужно будет сделать это самостоятельно, настроив плагин ресурсов, если вы абсолютно хотите пойти этим путем.
Более простой способ - вместо этого установить тестовое определение конкретного контекста в каталоге /src/test/resources
и загрузить через:
@ContextConfiguration(locations = { "classpath:mycontext.xml" })
Ответ 4
Простым решением является
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext.xml" })
из spring форум
Ответ 5
Используем:
@ContextConfiguration(locations="file:WebContent/WEB-INF/spitterMVC-servlet.xml")
проект представляет собой динамический веб-проект затмения, тогда путь:
{project name}/WebContent/WEB-INF/spitterMVC-servlet.xml
Ответ 6
Предположим, вы собираетесь создать test-context.xml, который не зависит от app-context.xml для тестирования, поместите test-context.xml в /src/test/resources. В тестовом классе добавьте аннотацию @ContextConfiguration поверх определения класса.
@ContextConfiguration(locations = "/test-context.xml")
public class MyTests {
...
}
Spring document Контекстное управление
Ответ 7
Загрузка файла из: {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..
}
}
Ответ 8
@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (location = { "/Beans.xml" })
открытый класс DemoTest {}
Ответ 9
Иногда это может быть что-то довольно простое, как пропустить ваш файл ресурсов в папке тестовых классов из-за некоторых очистки.