[kotlin] JUnit 테스트와 파일 입출력

JUnit은 자바 및 코틀린과 같은 JVM 언어로 작성된 코드의 단위 테스트에 널리 사용되는 프레임워크입니다. 파일 입출력과 같은 외부 리소스를 다룰 때 JUnit을 활용하여 테스트하는 것은 매우 중요합니다. 이 포스트에서는 코틀린JUnit을 사용하여 파일 입출력을 효과적으로 테스트하는 방법에 대해 알아보겠습니다.

JUnit 도입

우선 프로젝트의 build.gradle 또는 build.gradle.kts 파일에서 JUnit을 의존성으로 추가해야 합니다.

dependencies {
    testImplementation 'junit:junit:4.13.1'
}

파일 입출력 테스트 코드 작성

다음은 간단한 파일 입출력 기능을 하는 FileHandler 클래스입니다.

import java.io.File

class FileHandler {
    fun readFileContents(filePath: String): String {
        val file = File(filePath)
        return file.readText()
    }

    fun writeFileContents(filePath: String, content: String) {
        val file = File(filePath)
        file.writeText(content)
    }
}

JUnit을 사용한 테스트 코드 작성

이제 JUnit을 사용하여 FileHandler 클래스의 파일 입출력 기능을 테스트하는 코드를 작성해보겠습니다.

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*

class FileHandlerTest {
    private val fileHandler = FileHandler()
    private val testFilePath = "testFile.txt"
    private val testContent = "Hello, world!"

    @Test
    fun testFileReadWrite() {
        fileHandler.writeFileContents(testFilePath, testContent)
        val readContent = fileHandler.readFileContents(testFilePath)
        assertEquals(testContent, readContent)
    }
}

파일 시스템을 모킹한 테스트

일부 파일 시스템 구현체는 파일을 실제로 생성하고 다루기 때문에 실제 파일을 다루는 대신에 java.nio.file.FileSystem 인터페이스를 사용하여 파일 시스템을 모킹해야 할 수도 있습니다. 아래는 파일 시스템을 모킹한 FileHandler 클래스의 테스트 코드입니다.

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*
import java.nio.file.FileSystem
import java.nio.file.FileSystems
import java.nio.file.Files
import java.nio.file.Path

class FileHandlerMockTest {
    private val fileHandler = FileHandler()

    @Test
    fun testFileReadWrite() {
        val filePath = "testFile.txt"
        val content = "Hello, world!"

        val fileSystem: FileSystem = FileSystems.getDefault()
        val testFile: Path = fileSystem.getPath(filePath)

        fileHandler.writeFileContents(filePath, content)
        val readContent = fileHandler.readFileContents(filePath)

        assertEquals(content, readContent)

        // Clean up
        Files.deleteIfExists(testFile)
    }
}

마무리

JUnit을 사용하여 파일 입출력 기능을 가진 클래스를 효과적으로 테스트하는 방법을 살펴보았습니다. JUnit을 이용하면 파일 입출력 테스트를 쉽게 작성하고 외부 리소스를 다룰 때 예상치 못한 문제를 발견할 수 있습니다. 이를 통해 안정적인 파일 입출력 기능을 보장할 수 있습니다.

참고 문헌: