Spring @ContextConfiguration, как правильно расположить XML - PullRequest
49 голосов
/ 07 декабря 2010

В нашем проекте мы пишем тест, чтобы проверить, возвращает ли контроллер правильное представление модели

@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{
....

Эта документация недостаточно ясначтобы понять

Любое предложение о том, как убедиться, что контекстная аннотация загружает правильный XML?

Edit 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)

Ответы [ 9 ]

69 голосов
/ 17 марта 2012

Наши тесты выглядят так (с использованием 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 ....
}
40 голосов
/ 07 декабря 2010

Это причина не помещать конфигурацию в webapp.

Насколько я знаю, нет хороших способов получить доступ к файлам в папке webapp из юнит-тестов. Вместо этого вы можете поместить свою конфигурацию в src/main/resources, чтобы получить к ней доступ из своих модульных тестов (как описано в документации), а также из веб-приложения (используя префикс classpath: в contextConfigLocation).

Смотри также:

20 голосов
/ 07 декабря 2010

Я думаю, что это специфическая проблема maven.Maven не копирует файлы формы /src/main/resources в папку target-test.Вам придется сделать это самостоятельно, настроив плагин ресурсов, если вы абсолютно хотите пойти по этому пути.

Более простой способ - вместо этого поместить тестовое определение конкретного контекста в каталог /src/test/resources и загрузить через:

@ContextConfiguration(locations = { "classpath:mycontext.xml" })
10 голосов
/ 31 июля 2013

Простое решение

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

из весенний форум

5 голосов
/ 17 января 2012

Используем:

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

проект представляет собой динамический веб-проект затмения, тогда путь:

{project name}/WebContent/WEB-INF/spitterMVC-servlet.xml
4 голосов
/ 03 августа 2013

Предположим, вы собираетесь создать test-context.xml, который не зависит от app-context.xml для тестирования, поместите test-context.xml в / src / test / resources.В тестовом классе поместите аннотацию @ContextConfiguration поверх определения класса.

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

Spring-документ Управление контекстом

3 голосов
/ 17 октября 2015

Загрузка файла из: {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..          
    }
}
0 голосов
/ 14 декабря 2016

Иногда это может быть что-то довольно простое, например, отсутствие файла ресурсов в папке test-classses из-за некоторых очисток.

0 голосов
/ 16 апреля 2015

@ RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (location = {"/Beans.xml"}) открытый класс DemoTest {}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...