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