복붙노트

[SPRING] Spring @ContextConfiguration XML에 올바른 위치를 두는 법

SPRING

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가 돌려 주어집니다.

@context 구성을 구성 중입니다. 그러나 src \ main \ webapp \ root \ WEB-INF \ root-context.xml에있는 올바른 xml을로드하는 방법을 알지 못합니다.

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

이 문서는 이해하기에 충분하지 않습니다.

컨텍스트 어노테이션이 올바른 XML을로드하는 방법에 대한 제안 사항은 무엇입니까?

v2 수정

웹 INF 폴더의 구성 .xml 파일을 다음 위치로 복사했습니다.

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

웹 inf에서 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)

해결법

  1. ==============================

    1.그것이 webapp에 구성을 넣지 않는 이유입니다.

    그것이 webapp에 구성을 넣지 않는 이유입니다.

    지금까지 내가 아는 한, 단위 테스트에서 webapp 폴더에있는 파일에 액세스하는 좋은 방법이 없습니다. 컨피규레이션을 src / main / resources에 넣을 수 있기 때문에 단위 테스트 (docs에서 설명)와 webapp (contextConfigLocation의 classpath : 접두사 사용)에서 액세스 할 수 있습니다.

    참조 :

  2. ==============================

    2.우리의 테스트는 다음과 같다 (Maven과 Spring 3.1 사용).

    우리의 테스트는 다음과 같다 (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. ==============================

    3.이것은 내가 생각하는 maven 특정 문제이다. Maven은 / src / main / resources 파일을 target-test 폴더에 복사하지 않습니다. 이 방법을 절대적으로 원한다면 리소스 플러그인을 구성하여 직접해야 할 것입니다.

    이것은 내가 생각하는 maven 특정 문제이다. Maven은 / src / main / resources 파일을 target-test 폴더에 복사하지 않습니다. 이 방법을 절대적으로 원한다면 리소스 플러그인을 구성하여 직접해야 할 것입니다.

    더 쉬운 방법은 테스트 특정 컨텍스트 정의를 / src / test / resources 디렉토리에두고 다음을 통해로드하는 것입니다.

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

    4.간단한 해결책은

    간단한 해결책은

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

    봄의 포럼에서

  5. ==============================

    5.우리는 사용:

    우리는 사용:

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

    프로젝트가 동적 인 동적 인 웹 프로젝트 인 경우 경로는 다음과 같습니다.

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

    6.테스트를 위해 app-context.xml과 독립적 인 test-context.xml을 만들고, test-context.xml을 / src / test / resources 아래에 배치한다고 가정합니다. 테스트 클래스에서 @ContextConfiguration 주석을 클래스 정의 위에 놓습니다.

    테스트를 위해 app-context.xml과 독립적 인 test-context.xml을 만들고, test-context.xml을 / src / test / resources 아래에 배치한다고 가정합니다. 테스트 클래스에서 @ContextConfiguration 주석을 클래스 정의 위에 놓습니다.

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

    Spring 문서 컨텍스트 관리

  7. ==============================

    7.다음 위치에서 파일로드 : {project} /src/main/webapp/WEB-INF/spring-dispatcher-servlet.xml

    다음 위치에서 파일로드 : {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. ==============================

    8.@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = { "/Beans.xml"}) 공용 클래스 DemoTest {}

    @RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = { "/Beans.xml"}) 공용 클래스 DemoTest {}

  9. ==============================

    9.때로는 클린업으로 인해 테스트 클래스 폴더에 리소스 파일이 누락 된 것과 같은 간단한 작업 일 수도 있습니다.

    때로는 클린업으로 인해 테스트 클래스 폴더에 리소스 파일이 누락 된 것과 같은 간단한 작업 일 수도 있습니다.

  10. from https://stackoverflow.com/questions/4377699/spring-contextconfiguration-how-to-put-the-right-location-for-the-xml by cc-by-sa and MIT license