আমার একই সমস্যা ছিল যেখানে একটি ব্যক্তিগত মূল্য সেট করা হয়নি কারণ মকিতো সুপার কনস্ট্রাক্টরকে কল করে না। এখানে আমি প্রতিবিম্বের সাথে উপহাসকে কীভাবে বাড়িয়ে তুলছি।
প্রথমত, আমি একটি টেস্টUtils ক্লাস তৈরি করেছি যার মধ্যে এই প্রতিবিম্ব পদ্ধতিগুলি সহ অনেক সহায়ক ব্যবহার রয়েছে। প্রতিবার প্রয়োগ করার জন্য প্রতিবিম্ব অ্যাক্সেসটি কিছুটা দুর্বল। আমি প্রকল্পগুলিতে কোড পরীক্ষা করার জন্য এই পদ্ধতিগুলি তৈরি করেছি যেগুলির একটি বা অন্য কোনও কারণে কোনও মশকরা প্যাকেজ ছিল না এবং আমাকে এটি অন্তর্ভুক্ত করার জন্য আমন্ত্রণ জানানো হয়নি।
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
}
আমি এখানে আমার আসল প্রকল্প থেকে পৃষ্ঠাতে আমার কোডটি পরিবর্তন করেছি। একটি সংকলন সমস্যা হতে পারে বা দুটি। আমি মনে করি আপনি সাধারণ ধারণা পেয়েছেন। কোডটি দখল করতে দ্বিধা বোধ করুন এবং আপনি যদি এটি দরকারী মনে করেন তবে এটি ব্যবহার করুন।