[kotlin] 코틀린에서 인터페이스를 활용한 유닛 테스트 작성하기

개요

유닛 테스트는 소프트웨어의 정상적인 동작을 확인하는 중요한 단계입니다. 코틀린은 객체지향 언어로서 인터페이스를 지원하며, 이를 활용해서 유닛 테스트를 작성할 수 있습니다. 이 글에서는 코틀린에서 인터페이스를 활용하여 유닛 테스트를 작성하는 방법에 대해 알아보겠습니다.

인터페이스란?

인터페이스는 클래스가 구현해야하는 메서드들의 목록을 정의하는 것입니다. 즉, 클래스가 어떤 동작을 수행하기 위해 반드시 구현해야하는 메서드들을 결정짓는 역할을 합니다.

코틀린 인터페이스 작성하기

코틀린에서 인터페이스를 작성하는 방법은 다음과 같습니다:

interface MyInterface {
    fun myMethod(): String
}

인터페이스는 interface 키워드로 선언하며, 구현해야하는 메서드들을 정의합니다.

코틀린에서 인터페이스를 활용한 유닛 테스트 작성하기

인터페이스를 활용한 유닛 테스트 작성은 다음과 같은 절차를 따릅니다:

  1. 테스트 대상 클래스를 작성합니다. 이 클래스는 테스트하고자 하는 로직을 구현합니다.
  2. 인터페이스를 구현한 클래스를 작성합니다. 이 클래스는 테스트 대상 클래스의 의존성을 주입받아 동작합니다.
  3. 유닛 테스트 클래스를 작성합니다. 이 클래스는 테스트 대상 클래스를 인스턴스화하고 테스트 메서드를 작성합니다. 테스트 메서드에서는 인터페이스를 구현한 클래스의 객체를 생성하고, 테스트하고자 하는 메서드를 실행하여 예상되는 결과를 확인합니다.

예시 코드:

// 테스트 대상 클래스
class MyLogic {
    fun calculate(input: Int): Int {
        return input * 2
    }
}

// 인터페이스를 구현한 클래스
class MyInterfaceImpl(private val logic: MyLogic) : MyInterface {
    override fun myMethod(): String {
        val result = logic.calculate(5)
        return "Result: $result"
    }
}

// 유닛 테스트 클래스
class MyUnitTest {
    @Test
    fun testMyMethod() {
        val logic = MyLogic()
        val myInterface = MyInterfaceImpl(logic)
        
        val result = myInterface.myMethod()
        
        assertEquals("Result: 10", result)
    }
}

위 예시 코드에서 MyInterface 인터페이스를 구현한 MyInterfaceImpl 클래스가 테스트 대상 클래스인 MyLogic 클래스의 의존성을 주입받아 동작하고 있습니다.

MyUnitTest 클래스에서는 MyLogic 클래스와 MyInterfaceImpl 클래스를 인스턴스화하고, MyInterfaceImpl 클래스의 myMethod 메서드를 호출하여 예상되는 결과를 검증하고 있습니다.

마무리

이제 코틀린에서 인터페이스를 활용한 유닛 테스트 작성 방법을 알게 되었습니다. 인터페이스를 사용하면 테스트 대상 클래스의 의존성을 쉽게 모킹(mocking)할 수 있으며, 코드 유지 보수에 용이한 테스트 코드를 작성할 수 있습니다.