1
2
3
4
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 }