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