Saya memiliki masalah yang sama di mana nilai pribadi tidak ditetapkan karena Mockito tidak memanggil konstruktor super. Inilah cara saya menambah ejekan dengan refleksi.
Pertama, saya membuat kelas TestUtils yang berisi banyak utilitas bermanfaat termasuk metode refleksi ini. Akses refleksi agak sulit untuk diterapkan setiap kali. Saya membuat metode ini untuk menguji kode pada proyek yang, karena satu dan lain alasan, tidak memiliki paket mengejek dan saya tidak diundang untuk memasukkannya.
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);
}
}
}
Maka saya bisa menguji kelas dengan variabel pribadi seperti ini. Ini berguna untuk mengejek jauh di dalam pohon kelas yang tidak dapat Anda kendalikan.
@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
}
Saya memodifikasi kode saya dari proyek saya yang sebenarnya di sini, di halaman. Mungkin ada satu atau dua masalah kompilasi. Saya pikir Anda mendapatkan ide umum. Jangan ragu untuk mengambil kode dan menggunakannya jika Anda merasa berguna.