본문 바로가기

IT/TDD & Test

[JUnit] 파일 & 리소스 (/src/test/resources) 가져오기

반응형

* JUnit5 사용

 

1. 시나리오

* 테스트 중 파일을 읽거나 테스트 중인 정보를 파일에 써야 할 때가 있음

* 디렉토리의 파일을 읽는 방법이 필요함

 

2. File I/O 사용

* 가장 간단한 방법은 java.io.File 클래스의 인스턴스의 getAbsolutePath() 메소드를 호출하여 선택한 디렉터리를 읽는 방법

@Test
fun useFileIo() {
    val path: String = "src/test/resources"
    val file: File = File(path)
    val absolutePath = file.absolutePath

    println(absolutePath)
    assertTrue(absolutePath.endsWith(path))
}

 

* 출력 결과는 아레와 같다.

/Users/user/Documents/workspace/demo/TIL/etc/junit/src/test/resources

 

3. Path 사용

* Java7에 도입된 Path 클래스를 사용할 수 있음

* Paths.get() 정적 팩토리메서드를 호출

* 경로를 파일로 변환하고 getAbsolutePath()를 호출하여 사용

 

@Test
fun usePath() {
    val path = "src/test/resources"

    // kotlin version
     val resourceDirectory = Path(path)

    // java version
    // val resourceDirectory = Paths.get("src", "test", "resources")

    val absolutePath = resourceDirectory.toFile().absolutePath

    println(absolutePath)
    assertTrue(absolutePath.endsWith(path))
}

 

* 위 예제와 동일한 결과가 출력

/Users/user/Documents/workspace/demo/TIL/etc/junit/src/test/resources

 

4. ClassLoader 사용

* 코드를 작성하기 전 resources 폴더에 example_resource.txt을 작성해두어야 합니다.

 

@Test
fun useClassLoader() {
    val resourceName = "example_resource.txt"
    val classLoader = javaClass.classLoader
    val file = File(classLoader.getResource(resourceName).file)
    val absolutePath = file.absolutePath

    println(absolutePath)
    assertTrue(absolutePath.endsWith(resourceName))
}

 

* 아래 결과가 출력됩니다.

/Users/user/Documents/workspace/demo/TIL/etc/junit/build/resources/test/example_resource.txt

* ClassLoader가 클래스 경로에서 리소스를 찾기 때문에 이전과 다른 결과를 보여줌

* 클래스의 리소스는 실제 build된 디렉터리에 저장이 되기 때문

 

반응형