IT/언어

[Junit] private 메소드 테스트하는 방법

개발자 두더지 2023. 5. 31. 21:54
728x90

일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.

 

 

테스트용 코드 준비


public Sample {
    public int add(int x, int y) {
        return (x + y);
    }

    protected int minus(int x, int y) {
        return (x - y);
    }

    private int multiplication(int x, int y) {
        return (x * y);
    }
}

 

 

public 메소드의 테스트 코드


import org.junit.Test;

public class SampleTest {
    @Test
    public void testEqual() {
        Sample sample = new Sample();
        int expected = 10;
        int actual = sample.add(8, 2);

        assertEquals(expected, actual);
    }
}

 단순히 덧셈하는 테스트이다. 성공하는 예 뿐이지만, 보통의 테스트 코드이다.

 

 

protected, private 메소드 테스트


 인스턴스부터 protedc, private 메소드를 그대로 사용할 수 없으므로, 리플렉션이라고 불리는 방법을 사용하여 테스트 케이스를 작성한다.

 방법은 다음과 같다.

Sample sample = new Sample();
Method method = Sample.class.getDeclaredMethod("<메소드명>", 인수의 데이터형1, 인수의 데이터형2...);
method.setAccessible(true);
int actual = (반환값의 데이터형)method.invoke(<인스턴스>,인수1,인수2...);

 어떤 클래스에서도 존재하는 class 변수를 사용하며 getDeclareMethod() 메소드로 메소드를 획득한다. 획득한 메소드의 setAccessible(true)로 한다. 이것은 외부에서 액세스하는 것을 허가하기 위한 설정이다.그 후에는 method.invoke() 메소드로 메소드를 실행시킨다.

 실제로 테스트 케이스를 작성해보자.

import static org.junit.Assert.*;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

public class SampleTest {

    @Test
    public void testMinus()
        throws NoSuchMethodException,
        SecurityException,
        IllegalAccessException,
        IllegalArgumentException,
        InvocationTargetException
    {
        Sample sample = new Sample();
        int expected = 6;

        Method method = Sample.class.getDeclaredMethod("minus", int.class, int.class);
        method.setAccessible(true);

        int actual = (int)method.invoke(sample, 8, 2);

        assertEquals(expected, actual);
    }

    @Test
    public void testMultiplication()
        throws NoSuchMethodException,
        SecurityException,
        IllegalAccessException,
        IllegalArgumentException,
        InvocationTargetException
    {
        Sample sample = new Sample();
        int expected = 16;

        Method method = Sample.class.getDeclaredMethod("multiplication", int.class, int.class);
        method.setAccessible(true);

        int actual = (int)method.invoke(sample, 8, 2);

        assertEquals(expected, actual);
    }

참고자료

https://qiita.com/village/items/2f0d99b25eef0c8fd4ec

728x90