[java] Mockito를 사용하여 클래스의 private 필드 값을 변경하는 방법은?

Mockito는 Java에서 테스트 더블(mock, stub, spy 등)을 생성하고 사용하는 데 도움이 되는 프레임워크입니다. Mockito를 사용하여 클래스의 private 필드 값을 변경하는 방법은 다음과 같습니다.

  1. PowerMockito 사용하기: PowerMockito는 mockito와 함께 사용할 수 있는 라이브러리로서, 클래스의 private 필드를 변경할 수 있는 기능을 제공합니다. 다음은 Mockito와 PowerMockito를 함께 사용하여 private 필드 값을 변경하는 예시입니다.
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(YourClass.class) // 변경하려는 클래스를 PrepareForTest 어노테이션으로 지정해야 합니다.
public class YourClassTest {

    @Mock
    private YourClass yourClass;

    @Test
    public void testPrivateField() throws Exception {
        YourClass instance = PowerMockito.spy(new YourClass());
        
        PowerMockito.doReturn("newValue")
            .when(instance, PowerMockito.method(YourClass.class, "getPrivateField"))
            .invoke();

        String privateFieldValue = instance.getPrivateField();
        System.out.println(privateFieldValue); // "newValue" 출력
    }
}
  1. Reflection 사용하기: Reflection은 Java에서 객체의 private 필드 또는 메서드에 접근할 수 있는 기능을 제공합니다. 아래는 Reflection을 사용하여 private 필드 값을 변경하는 예시입니다.
import java.lang.reflect.Field;

public class YourClassTest {

    @Test
    public void testPrivateField() throws Exception {
        YourClass instance = new YourClass();

        Field privateField = instance.getClass().getDeclaredField("privateField");
        privateField.setAccessible(true); // private 필드에 접근 가능하도록 설정

        privateField.set(instance, "newValue");

        String privateFieldValue = (String) privateField.get(instance);
        System.out.println(privateFieldValue); // "newValue" 출력
    }
}

위의 두 가지 방법을 사용하여 클래스의 private 필드 값을 변경할 수 있습니다. 하지만 private 필드에 접근하는 것은 객체의 캡슐화를 위배하는 것일 수 있으므로, 신중하게 사용해야 합니다.