[JUnit] Reflection을 통한 private method Test

Y_Sevin·2023년 11월 9일
0

JUnit

목록 보기
3/3
post-thumbnail

프로젝트를 진행하며 프라이빗 메서드에 테스트 케이스를 작성하기 위해서는 어떻게 진행해야할지 고민이 있었다.

일반적으로 private method는 JUnit에서 직접 테스트하는 방법을 제공하지 않아 테스트하기가 어렵다.
때문에 힙 영역에 로드된 Class 타입의 객체를 통해서 해당 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API인 Reflection을 활용해 프라이빗 메서드에 대한 테스트 케이스를 작성하는 방법을 살펴보고자 한다.

Class

class TestClass{
    private int privateMethod(int number) {
		return number + 10;
    }
}

Test

class PrivateMethodTest {
    @Test
    void testPrivateMethod() throws Exception {
        TestClass TestClass = new TestClass();
        Method privateMethod = TestClass.class.getDeclaredMethod("privateMethod", int.class);
        privateMethod.setAccessible(true);
        int result = (int) privateMethod.invoke(TestClass, 10);
        assertEquals(20, result);
    }
}

과정

  1. Method privateMethod = TestClass.class.getDeclaredMethod("privateMethod", int.class);
    리플렉션을 사용하여 TestClass 클래스에서 privateMethodName 메서드를 가져온다. getDeclaredMethod를 사용하여 비공개 메서드에 액세스하고 메서드 이름과 인자 유형을 지정한다.

  2. privateMethod.setAccessible(true);
    비공개 메서드는 기본적으로 직접 접근할 수 없기 때문에 해당 접근성을 true로 설정하여 비공개 메서드에 액세스를 활성화한다.

  3. privateMethod.invoke(TestClass, 10);
    리플렉션을 사용하여 TestClass 인스턴스에서 비공개 메서드를 호출한다. 이는 메서드가 호출되는 개체로 TestClass를 전달하고 메서드에 10을 인수로 전달한다.


위와 같이 Reflection을 사용하면 private method에 접근하여 테스트할 수 있지만, 이런 방식은 보통 권장되지 않는다.
그 이유 중 하나는 안정성에 있어서다. Reflection을 통한 접근은 컴파일 타임에 에러를 잡아내기 어렵기 때문에, 코드 변경이나 리팩토링 시 런타임 에러가 발생할 가능성이 크다. 특히나 메서드의 이름이나 파라미터가 변경되면, 해당 변경에 대한 정보를 반영하지 못해 코드의 유지보수가 어려워진다.

또 다른 이유는 결합도의 증가이다. Reflection을 사용하면 클래스의 내부 구조에 의존하게 되어, 클래스의 구현이 변경되면 테스트 코드도 함께 수정해야 할 가능성이 높아진다. 이는 코드의 결합도가 높아져 유지보수를 어렵게 만든다.

따라서, private method를 테스트할 필요가 있다면, 해당 메서드를 public으로 변경하거나, 관련 기능을 public으로 제공하는 다른 방법을 고려하는 것이 더 좋은 방법일 수 있다. 이렇게 하면 코드의 안정성과 유지보수성을 향상시킬 수 있다. Reflection은 특별한 상황에서만 사용되어야 하며, 가능한 한 피하는 것이 좋다.

profile
매일은 아니더라도 꾸준히 올리자는 마음으로 시작하는 개발블로그😎

0개의 댓글