Mockito가 슈퍼 생성자를 호출하지 않기 때문에 개인 값이 설정되지 않은 것과 동일한 문제가있었습니다. 반사를 사용하여 조롱하는 방법을 설명합니다.
먼저, 이러한 리플렉션 메소드를 포함하여 많은 유용한 유틸리티를 포함하는 TestUtils 클래스를 작성했습니다. 리플렉션 액세스는 매번 구현하기에 약간 힘듭니다. 어떤 이유로 든 모의 패키지가 없으며 포함하도록 초대되지 않은 프로젝트에서 코드를 테스트하기 위해 이러한 방법을 만들었습니다.
public class TestUtils {
// get a static class value
public static Object reflectValue(Class<?> classToReflect, String fieldNameValueToFetch) {
try {
Field reflectField = reflectField(classToReflect, fieldNameValueToFetch);
reflectField.setAccessible(true);
Object reflectValue = reflectField.get(classToReflect);
return reflectValue;
} catch (Exception e) {
fail("Failed to reflect "+fieldNameValueToFetch);
}
return null;
}
// get an instance value
public static Object reflectValue(Object objToReflect, String fieldNameValueToFetch) {
try {
Field reflectField = reflectField(objToReflect.getClass(), fieldNameValueToFetch);
Object reflectValue = reflectField.get(objToReflect);
return reflectValue;
} catch (Exception e) {
fail("Failed to reflect "+fieldNameValueToFetch);
}
return null;
}
// find a field in the class tree
public static Field reflectField(Class<?> classToReflect, String fieldNameValueToFetch) {
try {
Field reflectField = null;
Class<?> classForReflect = classToReflect;
do {
try {
reflectField = classForReflect.getDeclaredField(fieldNameValueToFetch);
} catch (NoSuchFieldException e) {
classForReflect = classForReflect.getSuperclass();
}
} while (reflectField==null || classForReflect==null);
reflectField.setAccessible(true);
return reflectField;
} catch (Exception e) {
fail("Failed to reflect "+fieldNameValueToFetch +" from "+ classToReflect);
}
return null;
}
// set a value with no setter
public static void refectSetValue(Object objToReflect, String fieldNameToSet, Object valueToSet) {
try {
Field reflectField = reflectField(objToReflect.getClass(), fieldNameToSet);
reflectField.set(objToReflect, valueToSet);
} catch (Exception e) {
fail("Failed to reflectively set "+ fieldNameToSet +"="+ valueToSet);
}
}
}
그런 다음 이와 같은 개인 변수로 클래스를 테스트 할 수 있습니다. 이것은 제어 할 수없는 클래스 트리 깊이를 조롱하는 데 유용합니다.
@Test
public void testWithRectiveMock() throws Exception {
// mock the base class using Mockito
ClassToMock mock = Mockito.mock(ClassToMock.class);
TestUtils.refectSetValue(mock, "privateVariable", "newValue");
// and this does not prevent normal mocking
Mockito.when(mock.somthingElse()).thenReturn("anotherThing");
// ... then do your asserts
}
페이지의 실제 프로젝트에서 코드를 수정했습니다. 컴파일 문제가있을 수 있습니다. 나는 당신이 일반적인 생각을 얻는다고 생각합니다. 유용하다고 생각되면 코드를 잡고 사용하십시오.