मेरे पास एक ही मुद्दा था जहां एक निजी मूल्य निर्धारित नहीं किया गया था क्योंकि मॉकिटो सुपर कंस्ट्रक्टरों को नहीं बुलाता है। यहां बताया गया है कि मैं प्रतिबिंब के साथ किस तरह से मजाक करता हूं।
सबसे पहले, मैंने एक 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
}
मैंने अपने कोड को अपने वास्तविक प्रोजेक्ट से संशोधित कर यहां पृष्ठ में रखा है। एक संकलन मुद्दा या दो हो सकता है। मुझे लगता है कि आपको सामान्य विचार मिलेगा। यदि आप इसे उपयोगी पाते हैं तो कोड को हड़पने के लिए स्वतंत्र महसूस करें और इसका उपयोग करें।