Ich hatte das gleiche Problem, bei dem kein privater Wert festgelegt wurde, weil Mockito keine Superkonstruktoren aufruft. Hier ist, wie ich das Verspotten mit Nachdenken verstärke.
Zuerst habe ich eine TestUtils-Klasse erstellt, die viele hilfreiche Dienstprogramme enthält, einschließlich dieser Reflexionsmethoden. Der Reflexionszugriff ist jedes Mal etwas schwierig zu implementieren. Ich habe diese Methoden erstellt, um Code für Projekte zu testen, die aus dem einen oder anderen Grund kein Verspottungspaket hatten, und ich wurde nicht eingeladen, ihn einzuschließen.
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);
}
}
}
Dann kann ich die Klasse mit einer privaten Variablen wie dieser testen. Dies ist nützlich, um sich tief in Klassenbäumen zu verspotten, auf die Sie ebenfalls keine Kontrolle haben.
@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
}
Ich habe meinen Code aus meinem eigentlichen Projekt hier auf Seite geändert. Möglicherweise liegt ein oder zwei Kompilierungsprobleme vor. Ich denke, Sie haben eine allgemeine Vorstellung. Nehmen Sie den Code und verwenden Sie ihn, wenn Sie ihn nützlich finden.