1 /* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockito.internal.util.reflection; 6 7 import org.mockito.internal.configuration.plugins.Plugins; 8 import org.mockito.plugins.MemberAccessor; 9 10 import java.lang.reflect.Field; 11 import java.lang.reflect.Modifier; 12 13 public class LenientCopyTool { 14 15 MemberAccessor accessor = Plugins.getMemberAccessor(); 16 copyToMock(T from, T mock)17 public <T> void copyToMock(T from, T mock) { 18 copy(from, mock, from.getClass()); 19 } 20 copyToRealObject(T from, T to)21 public <T> void copyToRealObject(T from, T to) { 22 copy(from, to, from.getClass()); 23 } 24 copy(T from, T to, Class<?> fromClazz)25 private <T> void copy(T from, T to, Class<?> fromClazz) { 26 while (fromClazz != Object.class) { 27 copyValues(from, to, fromClazz); 28 fromClazz = fromClazz.getSuperclass(); 29 } 30 } 31 copyValues(T from, T mock, Class<?> classFrom)32 private <T> void copyValues(T from, T mock, Class<?> classFrom) { 33 Field[] fields = classFrom.getDeclaredFields(); 34 35 for (Field field : fields) { 36 // ignore static fields 37 if (Modifier.isStatic(field.getModifiers())) { 38 continue; 39 } 40 try { 41 Object value = accessor.get(field, from); 42 accessor.set(field, mock, value); 43 } catch (Throwable t) { 44 // Ignore - be lenient - if some field cannot be copied then let's be it 45 } 46 } 47 } 48 } 49