[Java] JUnit으로 Java 클래스의 private 메서드와 필드를 테스트하는 방법

[Java] JUnit으로 Java 클래스의 private 메서드와 필드를 테스트하는 방법

Java
민호이 민호이 2025. 1. 13. 18:47
목차
  1. 1. 문제 정의
  2. 2. 왜 private 메서드를 직접 테스트해야 하나요?
  3. 2.1 일반적인 권장 사항
  4. 2.2 테스트가 필요한 상황
  5. 3. 테스트 방법
  6. 3.1 Reflection을 사용한 테스트
  7. 3.2 설계를 개선하여 테스트
  8. 3.3 Mockito를 사용한 테스트
  9. 4. 결론
  10. Reference

1. 문제 정의

Java 애플리케이션에서 private 메서드, 필드 또는 내부 클래스를 테스트해야 할 때, 이들이 외부에서 접근할 수 없다는 이유로 테스트가 어려울 수 있습니다. 하지만 코드의 안정성을 보장하기 위해 내부 로직도 테스트해야 할 때가 있습니다.

이 문서에서는 JUnit을 사용하여 private 메서드 및 필드를 테스트하는 다양한 방법과 최적의 접근 방식을 설명합니다.


2. 왜 private 메서드를 직접 테스트해야 하나요?

2.1 일반적인 권장 사항

    • Public 메서드를 테스트하세요:
      일반적으로 private 메서드는 public 메서드를 통해 간접적으로 테스트해야 합니다.
    • 예: public 메서드가 내부적으로 private 메서드를 호출할 때, 자연스럽게 테스트됩니다.

2.2 테스트가 필요한 상황

  • 복잡한 로직을 포함한 private 메서드가 있는 경우.
  • 내부적으로 사용되는 메서드의 독립적인 검증이 필요한 경우.
  • 유지보수와 디버깅의 용이성을 위해 private 메서드의 개별 테스트가 필요할 때.

3. 테스트 방법

3.1 Reflection을 사용한 테스트

Java의 Reflection API를 사용하면 private 메서드 및 필드에 접근할 수 있습니다. Reflection은 런타임에 클래스 정보를 읽고 수정할 수 있는 강력한 도구입니다.

예제: Reflection을 사용해 private 메서드 테스트

import org.junit.jupiter.api.Test;
import java.lang.reflect.Method;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class ReflectionTest {
@Test
void testPrivateMethod() throws Exception {
// 테스트 대상 클래스의 인스턴스 생성
MyClass obj = new MyClass();
// private 메서드 호출
Method method = MyClass.class.getDeclaredMethod("privateMethod", int.class);
method.setAccessible(true); // private 메서드 접근 허용
// 메서드 호출 및 결과 검증
int result = (int) method.invoke(obj, 5);
assertEquals(25, result); // 기대 값과 비교
}
}
class MyClass {
private int privateMethod(int num) {
return num * num;
}
}

장점

  • 기존 코드 수정 없이 private 메서드 테스트 가능.

단점

  • Reflection 사용은 성능에 영향을 줄 수 있으며, 코드 가독성을 저하시킬 수 있음.

3.2 설계를 개선하여 테스트

가능한 경우 private 메서드의 설계를 개선하여 테스트를 간접적으로 수행할 수 있습니다.

1. 리팩토링으로 private 메서드 제거

private 메서드의 로직이 중요한 경우, 해당 로직을 별도의 클래스로 분리하여 독립적으로 테스트할 수 있습니다.

class MathUtility {
public int square(int num) {
return num * num;
}
}
class MyClass {
private MathUtility utility = new MathUtility();
public int calculateSquare(int num) {
return utility.square(num);
}
}

2. Protected 접근자로 변경

테스트 목적이라면 private 대신 protected로 변경하고, 동일 패키지 내 테스트 클래스를 작성할 수 있습니다.


3.3 Mockito를 사용한 테스트

Mockito와 같은 Mocking 프레임워크를 사용하여 private 메서드를 호출하는 public 메서드를 테스트할 수 있습니다.

import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
class MyClass {
private int privateMethod(int num) {
return num * num;
}
public int calculate(int num) {
return privateMethod(num) + 10;
}
}
public class MockitoTest {
@Test
void testPublicMethodWithPrivateLogic() {
MyClass obj = spy(MyClass.class);
// private 메서드 모킹
doReturn(25).when(obj).privateMethod(5);
// 결과 검증
assertEquals(35, obj.calculate(5));
}
}

4. 결론

Java에서 private 메서드를 테스트하는 것은 권장되지는 않지만, Reflection, 리팩토링, 또는 Mocking 프레임워크를 사용하면 가능해집니다. 가장 중요한 것은 테스트를 통해 클래스의 계약(Contract)을 검증하며, 필요에 따라 적절한 접근 방법을 선택해야 합니다.

 

Reference

https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-fields-or-inner-classes

저작자표시 비영리 변경금지 (새창열림)
  1. 1. 문제 정의
  2. 2. 왜 private 메서드를 직접 테스트해야 하나요?
  3. 2.1 일반적인 권장 사항
  4. 2.2 테스트가 필요한 상황
  5. 3. 테스트 방법
  6. 3.1 Reflection을 사용한 테스트
  7. 3.2 설계를 개선하여 테스트
  8. 3.3 Mockito를 사용한 테스트
  9. 4. 결론
  10. Reference
'Java' 카테고리의 다른 글
  • [Java] Java에서 equals와 hashCode 메서드를 왜 재정의해야 하는가?
  • [Java] i++, ++i 간의 차이 (전위 연산자와 후위 연산자)
  • [Java] "java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException" 해결 방법: Java 9/10/11 지
  • [Java] 'non-static method cannot be referenced from a static context' 오류 해결 방법
민호이
민호이
민호이
ChungCODE
민호이
전체
오늘
어제
  • Categories (128)
    • 스포츠 (6)
    • 인공지능 (5)
    • 주식 (6)
      • 경제 주식 전망 (5)
      • ETF (9)
    • CSAPP (4)
      • Lab Session (4)
      • Concepts (0)
    • C (19)
    • Java (24)
    • Rust (44)
      • Concepts (27)
      • Libraries (17)
    • PS (2)
    • 국내 소식 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘
  • c++
  • 유클리드 호제법
  • 최대공약수
  • 코드업
  • C
  • 최소공배수
  • 수학

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.v4.2.1
민호이
[Java] JUnit으로 Java 클래스의 private 메서드와 필드를 테스트하는 방법
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.