View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
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  }