1
2
3
4
5 package mockit.internal.injection;
6
7 import static java.lang.reflect.Modifier.isFinal;
8
9 import static mockit.internal.reflection.FieldReflection.getFieldValue;
10 import static mockit.internal.reflection.FieldReflection.setFieldValue;
11
12 import edu.umd.cs.findbugs.annotations.NonNull;
13 import edu.umd.cs.findbugs.annotations.Nullable;
14
15 import java.lang.reflect.Field;
16
17 import mockit.Tested;
18 import mockit.internal.util.TypeConversion;
19
20 final class TestedField extends TestedObject {
21 @NonNull
22 private final Field testedField;
23
24 TestedField(@NonNull InjectionState injectionState, @NonNull Field field, @NonNull Tested metadata) {
25 super(injectionState, metadata, field.getDeclaringClass(), field.getName(), field.getGenericType(),
26 field.getType());
27 testedField = field;
28 }
29
30 boolean isFromBaseClass(@NonNull Class<?> testClass) {
31 return testedField.getDeclaringClass() != testClass;
32 }
33
34 @Override
35 boolean alreadyInstantiated(@NonNull Object testClassInstance) {
36 return isAvailableDuringSetup() && getFieldValue(testedField, testClassInstance) != null;
37 }
38
39 @Nullable
40 @Override
41 Object getExistingTestedInstanceIfApplicable(@NonNull Object testClassInstance) {
42 Object testedObject = null;
43
44 if (!createAutomatically) {
45 Class<?> targetClass = testedField.getType();
46 testedObject = getFieldValue(testedField, testClassInstance);
47
48 if (testedObject == null || isNonInstantiableType(targetClass, testedObject)) {
49 String providedValue = metadata.value();
50
51 if (!providedValue.isEmpty()) {
52 testedObject = TypeConversion.convertFromString(targetClass, providedValue);
53 }
54
55 createAutomatically = testedObject == null && !isFinal(testedField.getModifiers());
56 }
57 }
58
59 return testedObject;
60 }
61
62 @Override
63 void setInstance(@NonNull Object testClassInstance, @Nullable Object testedInstance) {
64 setFieldValue(testedField, testClassInstance, testedInstance);
65 }
66 }