ฉันมีปัญหาเดียวกันกับที่ไม่ได้ตั้งค่าส่วนตัวเนื่องจาก Mockito ไม่เรียกตัวสร้างขั้นสูง นี่คือวิธีที่ฉันเพิ่มการล้อเลียนด้วยการสะท้อน
ก่อนอื่นฉันสร้างคลาส TestUtils ที่มีประโยชน์มากมายรวมถึงวิธีการสะท้อนแสงเหล่านี้ การเข้าถึงการสะท้อนกลับเป็นเรื่องยากที่จะใช้งานในแต่ละครั้ง ฉันสร้างวิธีการเหล่านี้เพื่อทดสอบโค้ดในโครงการที่ไม่ว่าจะด้วยเหตุผลใดก็ตามไม่มีแพ็คเกจจำลองและฉันไม่ได้รับเชิญให้รวมไว้ด้วย
public class TestUtils {
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;
}
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;
}
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;
}
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 {
ClassToMock mock = Mockito.mock(ClassToMock.class);
TestUtils.refectSetValue(mock, "privateVariable", "newValue");
Mockito.when(mock.somthingElse()).thenReturn("anotherThing");
}
ฉันแก้ไขรหัสจากโครงการจริงของฉันที่นี่ในหน้า อาจมีปัญหาในการคอมไพล์หรือสองปัญหา ฉันคิดว่าคุณคงเข้าใจดี อย่าลังเลที่จะคว้ารหัสและใช้งานได้หากคุณพบว่ามีประโยชน์