Mockito süper kurucuları çağırmadığı için özel bir değerin ayarlanmadığı aynı sorunu yaşadım. İşte yansıma ile alay etmeyi nasıl artırıyorum.
İlk olarak, bu yansıma yöntemleri dahil olmak üzere birçok yararlı araç içeren bir TestUtils sınıfı oluşturdum. Yansıma erişiminin her seferinde uygulanması biraz risklidir. Bu yöntemleri, bir nedenden ötürü alay paketi olmayan projelerde kodu test etmek için oluşturdum ve onu dahil etmeye davet edilmedim.
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);
}
}
}
Sonra sınıfı böyle bir özel değişkenle test edebilirim. Bu, sizin de kontrolünüz olmayan sınıf ağaçlarının derinlikleriyle alay etmek için kullanışlıdır.
@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
}
Kodumu gerçek projemden burada, sayfada değiştirdim. Bir veya iki derleme sorunu olabilir. Sanırım genel fikri anladınız. Kodu almaktan ve yararlı bulursanız kullanmaktan çekinmeyin.