[kotlin] 코틀린 Mockito를 활용한 데이터베이스나 외부 API 호출의 단위 테스트 작성법

좋은 테스트는 외부 의존성을 제어하여 신속하게 실행할 수 있는 테스트입니다. Mockito는 코틀린에서 외부 의존성을 대체하고 테스트 중심의 개발을 지원하는데 탁월한 도구입니다. 이 포스트에서는 코틀린과 Mockito를 사용하여 데이터베이스나 외부 API 호출에 대한 단위 테스트를 작성하는 방법에 대해 알아보겠습니다.

1. 의존성 주입 패턴

의존성 주입 패턴을 사용하여 코드를 테스트하기 쉽게 만들 수 있습니다. 의존성 주입 패턴은 클래스가 직접 생성하는 대신 의존성을 받아서 사용하는 방식을 말합니다.

class DataService(private val database: Database) {
    fun getData(id: String): String {
        return database.retrieveData(id)
    }
}

위의 예시에서 DataService 클래스는 Database 클래스에 의존하고 있습니다. 이렇게 의존성을 주입하면 Database의 동작을 대체하기 쉽고 테스트하기 쉬워집니다.

2. Mockito를 사용한 단위 테스트

Mockito를 사용하면 외부 의존성을 가짜 객체로 대체하여 테스트할 수 있습니다.

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock

class DataServiceTest {

    @Test
    fun `test getData`() {
        val mockDatabase = mock(Database::class.java)
        `when`(mockDatabase.retrieveData("123")).thenReturn("mocked data")

        val dataService = DataService(mockDatabase)
        val result = dataService.getData("123")

        assertEquals("mocked data", result)
    }
}

위의 예시에서 Database 클래스의 동작을 대체하기 위해 mock(Database::class.java)를 사용했습니다. 그리고 when을 사용하여 해당 메서드 호출 시 원하는 값을 반환하도록 설정했습니다.

3. 외부 API 호출의 단위 테스트

외부 API 호출을 테스트할 때에도 Mockito를 활용하여 외부 의존성을 제어할 수 있습니다.

class ApiService(private val httpClient: HttpClient) {
    fun fetchData(): String {
        val response = httpClient.get("https://api.example.com/data")
        return response.body.toString()
    }
}

위의 예시에서 ApiService 클래스는 외부 API에 의존하고 있습니다. 이를 테스트하기 위해 HttpClient 클래스의 동작을 모의(mock)할 수 있습니다.

마무리

코틀린과 Mockito를 사용하여 데이터베이스나 외부 API 호출에 대한 단위 테스트를 작성하는 방법을 살펴보았습니다. 이를 통해 외부 의존성을 대체하고 테스트 중심의 개발을 적용하여 안정적인 코드를 작성할 수 있습니다.

참고문헌:

특히 Mockito 문서는 Mockito의 다양한 사용법을 알려주는데 유용할 것입니다.