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