2011-01-05 5 views
2

희망은 메이븐 테스트/resources 디렉토리 및 통합 테스트

내가 기본 디렉토리 구조가 포함 된 통합 테스트 모듈이 ... 간단한 질문해야한다 : 내 자원 디렉토리 내에서 다음

src 
|-main 
|-test 
    |-java 
    |-resources 

를 I xxxx.xml 및 xxxx.xsd 파일을 가지고, 나는 내 테스트의 일환으로 이러한 파일을로드해야합니다

@Test 
public void should_do_some_stuff_with_xml_and_xsd() // not actual test name 
{ 
    File xmlFile = new File("xxxx.xml"); 
    File xsdFile = new File("xxxx.xsd"); 
    ... 
} 

그것은 파일을로드하려고 실패 계속, 지금은 t가 다운 된 것으로 추정 o 프로젝트 루트 또는 상대 경로에서 상대 경로를 제공해야합니다. IDE에 외부에서 실행하려면이 테스트가 필요합니다. 그래서 빌드 서버에서 테스트를 실행할 수 있습니다 ...

이 파일을 어떻게 타겟팅합니까?

답변

11

classpath 메커니즘이 파일에 대해 작동하지 않습니다. 상대 파일 경로는 classpath 요소가 아니라 현재 디렉토리에서 확인됩니다.

그래서 당신은 훨씬 청소기 솔루션에는 InputStream 대신 파일로 작업하는 것입니다, 그러나

File xmlFile = new File("target/test-classes/xxxx.xml"); 
File xsdFile = new File("target/test-classes/xxxx.xsd"); 

을 할 수 있습니다. File 매개 변수를 지원하는 거의 모든 라이브러리는 InputStream 매개 변수도 지원합니다.

ClassLoader cldr = Thread.currentThread().getContextClassLoader(); 
InputStream xmlStream = cldr.getResourceAsStream("xxxx.xml"); 
InputStream xsdStream = cldr.getResourceAsStream("xxxx.xsd"); 

참조 :

  • Byte Streams (썬 자바 튜토리얼)
  • ClassLoader (javadoc는)
  • InputStream (javadoc의 그리고 그런 식으로 당신은 수동으로 경로를 지정하지 않고 ClassLoader 마법을 사용할 수 있습니다)
+0

실제로 입력 스트림 대신 파일을 원한다면 다음과 같이하면됩니다 :'File xmlFile = new File (Thread.currentThread(). getContextClassLoader(). getResource ("xxxx.xml"));' – paperhat