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.expectations.mocking;
7   
8   import edu.umd.cs.findbugs.annotations.NonNull;
9   
10  import java.lang.reflect.TypeVariable;
11  
12  import mockit.internal.state.TestRun;
13  
14  final class FieldTypeRedefinition extends TypeRedefinition {
15      private boolean usePartialMocking;
16  
17      FieldTypeRedefinition(@NonNull MockedType typeMetadata) {
18          super(typeMetadata);
19      }
20  
21      boolean redefineTypeForTestedField() {
22          usePartialMocking = true;
23          return redefineTypeForFieldNotSet();
24      }
25  
26      @Override
27      void configureClassModifier(@NonNull MockedClassModifier modifier) {
28          if (usePartialMocking) {
29              modifier.useDynamicMocking();
30          }
31      }
32  
33      @SuppressWarnings("ConstantConditions")
34      boolean redefineTypeForFinalField() {
35          if (targetClass == TypeVariable.class || !typeMetadata.injectable && targetClass.isInterface()) {
36              String mockFieldName = typeMetadata.getName();
37              throw new IllegalArgumentException("Final mock field \"" + mockFieldName + "\" must be of a class type");
38          }
39  
40          return redefineTypeForFieldNotSet();
41      }
42  
43      private boolean redefineTypeForFieldNotSet() {
44          boolean redefined = redefineMethodsAndConstructorsInTargetType();
45  
46          if (redefined) {
47              TestRun.mockFixture().registerMockedClass(targetClass);
48          }
49  
50          return redefined;
51      }
52  }