2016-11-20 5 views
1

유닛 테스트에서 텍스트 파일을 읽었으며 리소스 폴더에 일부 입력 텍스트 파일을 배치했습니다. 다음은 디렉토리 구조입니다.JUnit 테스트에서 리소스 파일 읽기

  • SRC -> COM -> AU -> MyApp를 -> 폴더의 유틸리티 -> MyFileReader
  • 테스트 -> COM -> AU -> MyApp를 -> 폴더의 유틸리티 -> MyFileReaderTest
  • 테스트 -> COM -> AU -> MyApp를 -> 자원 ->

주 input.txt를 SRC 테스트는 동일한 계층 구조에 있는지.

public class MyFileReaderTest 
{ 

    ClassLoader classLoader = getClass().getClassLoader(); 

    @Test 
    public void testReadInputFile() throws Exception 
    { 
    String file = classLoader.getResource("test/com/au/myapp/resources/input.txt").getFile(); 
    List<String> result = InputFileReader.getInstance().readFile(file); 
    assertEquals("Size of the list should be 2", 2, result.size()); 
    } 
} 

Classloader.getResource()을 반환합니다. 도움을 주셔서 감사합니다.

+1

.class를 사용하여 상대 경로를 찾을 수 있는지 확인하십시오. http://stackoverflow.com/questions/6608795/what-is-the-difference-between-class-getresource-and-classloader-getresource –

+1

' classes' 클래스의'getResourceAsStream()'메소드를 사용할 수 있습니다. –

답변

5

클래스 로더는 클래스 경로를 사용하여 리소스를로드합니다. 수업은 대부분 com.au.myapp.util 패키지에 있습니다. test.com.au.myapp.util 패키지에 들어 있지 않습니다.

디렉토리 구조가 패키지 구조와 일치했습니다. 이는 src와 test 디렉토리가 모두 소스 루트임을 의미합니다.

파일이 소스 루트 아래의 com/au/myapp/resources 디렉토리에 있으므로 해당 패키지는 com.au.myapp.resources입니다.

그래서 당신은

classLoader.getResource("com/au/fitbits/resources/input.txt"); 

이 클래스 경로에서로드 자원입니다 필요합니다. 개발 모드에 있고 파일 시스템에서 클래스를 직접로드하므로 파일 일 수 있습니다. 그러나 프로덕션 환경에서는 파일 시스템에서 더 이상로드되지 않지만 jar 파일에서로드됩니다. 따라서 파일 IO를 사용하여이 리소스의 내용을 읽을 수는 없습니다. 따라서

classLoader.getResourceAsStream("com/au/fitbits/resources/input.txt") 

을 사용하고이 스트림에서 읽으십시오.

+0

고마워요. 네, 효과가있었습니다. 그러나, 나는해야했다 -> file.substring (1) – Anuruddha

관련 문제