복붙노트

[SPRING] 봄 junit 테스트 응용 프로그램 컨텍스트로드

SPRING

봄 junit 테스트 응용 프로그램 컨텍스트로드

내 WEB-INF 디렉토리 아래에 몇 가지 XML 파일이 있습니다.

서블릿 XML은 다른 XML 파일을 가져옵니다.

<import resource="dataSource.xml"/>
<import resource="hibernate.xml"/>
<import resource="beans.xml"/>

내 junit4 JukeboxTest 클래스에 전체 스프링 구성을 포함시키고 싶습니다. 기본 파일 이름을 사용하여 JukeboxTest-content.xml 파일을 만들었습니다. 그리고 마지막으로, 나는 거기에 무엇을 넣을 지 모른다 ...

난 노력 했어:

<import resource="/WEB-INF/dataSource.xml"/>
<import resource="/WEB-INF/hibernate.xml"/>
<import resource="/WEB-INF/beans.xml"/>

또는

<import resource="classpath:./WEB-INF/dataSource.xml"/>
<import resource="classpath:./WEB-INF/hibernate.xml"/>
<import resource="classpath:./WEB-INF/beans.xml"/>

다른 아이디어들도 모두 실패했습니다. 누군가 그 파일에 접근하는 방법과 스프링이 파일 경로를 해석하는 방법을 가르쳐 주시겠습니까?

해결법

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

    1.옵션 1 (권장 사항이므로 권장) : WEB-INF에서 설정 파일을 리 팩터하고 통합 테스트에서 액세스하려는 공통 부분을 src / main / resources /로 이동합니다. 그런 다음 src / test / resources /에 테스트 특정 구성 파일을 작성하십시오 (src / main에서 여러 컨텍스트 파일을 가져 와서 테스트 컨텍스트를 어셈블 링 한 다음이 컨텍스트를 건너 뛰고 @ContextConfiguration을 사용하는 것이 좋음).

    옵션 1 (권장 사항이므로 권장) : WEB-INF에서 설정 파일을 리 팩터하고 통합 테스트에서 액세스하려는 공통 부분을 src / main / resources /로 이동합니다. 그런 다음 src / test / resources /에 테스트 특정 구성 파일을 작성하십시오 (src / main에서 여러 컨텍스트 파일을 가져 와서 테스트 컨텍스트를 어셈블 링 한 다음이 컨텍스트를 건너 뛰고 @ContextConfiguration을 사용하는 것이 좋음).

    옵션 2 (해킹) : 같은 참조를 사용하십시오 :

    @ContextConfiguration("file:src/main/webapp/WEB-INF/dataSource.xml")
    

    옵션 3 (해킹) : Maven 프로젝트가있는 경우 테스트 실행 중에 추가 classpath 요소로 src / main / webapp을 선언하도록 maven-surefire-plugin (테스트 단계에서 사용됨)을 구성 할 수 있습니다.

    후자의 두 옵션은 해킹으로 간주됩니다. 왜냐하면 src / main / webapp 아래의 파일이 클래스 경로에 있지 않기 때문입니다.

    이러한 파일을 classpath : / WEB-INF / *. xml로 참조 할 수없는 이유는 클래스 경로에 실제로 존재하지 않는다는 것입니다. 웹 애플리케이션이 어떻게 패키지화되는지, 그리고 클래스 패스에서 정확히 끝나는 것을 이해하는 것이 중요합니다. 기본 Maven 프로젝트 구조를 가정합니다.

    알아 두어야 할 가장 중요한 점은 classpath는 / WEB-INF / classes와 / WEB-INF / lib에있는 각 jar에 대한 항목 하나만 포함한다는 것입니다. 따라서이 두 위치 외부의 리소스는 클래스 로더에서 완전히 보이지 않습니다. 이는 / WEB-INF 아래의 xml 구성 파일에서도 마찬가지입니다. 따라서 reference classpath : /WEB-INF/dataSource.xml이 절대로 작동하지 않습니다.

    클래스 패스에서 접근 할 수 없다면 스프링에 의해로드 된이 XML 설정 파일은 어떻게 될까? 대답은 간단합니다 : 단위 테스트 / 통합 테스트와 달리 webapp를 시작하면 ServletContext (Servlet API의 실제 클래스)에 대한 액세스를 제공하는 Servlet Container에서 실행되므로 ServletContext가 사용됩니다. 이러한 파일을로드하려면 getResourceAsStream ()을 호출하십시오. 이해의 열쇠는,이 메소드의 javadoc의 다음의 인용입니다.

    죄송합니다. 너무 길어 지지만 그게 전부입니다 ...

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

    2.이 시도

    이 시도

    @ContextConfiguration(locations = {"classpath:**/dataSource.xml",
                                   "classpath:**/hibernate.xml", 
                                   "classpath:**/WEB-INF/beans.xml"})
    
  3. from https://stackoverflow.com/questions/14946298/spring-junit-load-application-context-for-tests by cc-by-sa and MIT license