[Android] 안드로이드 개발에서 Private 함수 테스트: 실전 팁과 예제
안드로이드 애플리케이션을 개발하면서, private 함수는 클래스 내부 구현 세부 사항을 캡슐화하는 중요한 역할을 합니다. 하지만 이러한 private 함수를 테스트해야 하는 상황이 발생할 수 있습니다. 이 글에서는 Kotlin과 안드로이드 환경에서 private 함수를 테스트하는 다양한 방법과 사례를 소개합니다.
Private 함수는 왜 테스트가 어려울까?
Private 함수는 클래스 내부에서만 접근 가능하기 때문에, 일반적인 단위 테스트에서는 직접 호출할 수 없습니다. 이는 객체지향 프로그래밍의 캡슐화 원칙을 따르는 설계입니다. 하지만 다음과 같은 이유로 private 함수를 테스트하고 싶을 때가 있습니다:
- 복잡한 로직을 포함하고 있는 경우
- 디버깅 과정에서 문제를 확인해야 하는 경우
- 코드 품질을 높이기 위해 특정 로직을 검증하려는 경우
Private 함수 테스트 방법
1. Public 함수로 간접 테스트하기
가장 권장되는 접근법은 private 함수를 호출하는 public 함수를 테스트하는 것입니다. 이렇게 하면 캡슐화를 유지하면서도 내부 로직을 검증할 수 있습니다.
class Calculator {
fun add(a: Int, b: Int): Int {
return addInternal(a, b)
}
private fun addInternal(a: Int, b: Int): Int {
return a + b
}
}
// 테스트 코드
class CalculatorTest {
@Test
fun `add should return correct sum`() {
val calculator = Calculator()
val result = calculator.add(2, 3)
assertEquals(5, result)
}
}
2. Reflection 사용하기
Reflection을 사용하면 private 함수에 직접 접근할 수 있습니다. 하지만 이는 캡슐화를 깨뜨릴 수 있으므로 신중히 사용해야 합니다.
class Calculator {
private fun multiply(a: Int, b: Int): Int {
return a * b
}
}
// 테스트 코드
class CalculatorTest {
@Test
fun `multiply should return correct product`() {
val calculator = Calculator()
val method = Calculator::class.java.getDeclaredMethod("multiply", Int::class.java, Int::class.java)
method.isAccessible = true
val result = method.invoke(calculator, 2, 3) as Int
assertEquals(6, result)
}
}
3. Internal 함수로 변경하고 @VisibleForTesting 사용하기
private 함수를 internal로 변경하고 @VisibleForTesting 어노테이션을 추가하면 테스트 목적으로만 접근이 가능하다는 의도를 명확히 전달할 수 있습니다.
import androidx.annotation.VisibleForTesting
class Calculator {
@VisibleForTesting
internal fun subtract(a: Int, b: Int): Int {
return a - b
}
}
// 테스트 코드
class CalculatorTest {
@Test
fun `subtract should return correct difference`() {
val calculator = Calculator()
val result = calculator.subtract(5, 3)
assertEquals(2, result)
}
}
결론
private 함수를 테스트하는 가장 이상적인 방법은 public 함수를 통해 간접적으로 테스트하는 것입니다. 하지만 특별한 상황에서는 Reflection이나 @VisibleForTesting을 활용할 수도 있습니다. 상황에 맞는 방법을 선택하여 캡슐화를 유지하면서도 효과적으로 코드를 검증해보세요.