[java] Mockito를 사용하여 클래스의 private 필드 값을 변경하는 방법은?
Mockito는 Java에서 테스트 더블(mock, stub, spy 등)을 생성하고 사용하는 데 도움이 되는 프레임워크입니다. Mockito를 사용하여 클래스의 private 필드 값을 변경하는 방법은 다음과 같습니다.
- 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" 출력
}
}
- 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 필드에 접근하는 것은 객체의 캡슐화를 위배하는 것일 수 있으므로, 신중하게 사용해야 합니다.