View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
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  }