• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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