1
2
3
4
5 package mockit.internal.expectations.invocation;
6
7 import edu.umd.cs.findbugs.annotations.NonNull;
8 import edu.umd.cs.findbugs.annotations.Nullable;
9
10 import java.lang.reflect.Member;
11 import java.util.List;
12 import java.util.Map;
13
14 import mockit.asm.jvmConstants.Access;
15 import mockit.internal.expectations.argumentMatching.ArgumentMatcher;
16 import mockit.internal.expectations.state.ExecutingTest;
17 import mockit.internal.reflection.RealMethodOrConstructor;
18 import mockit.internal.state.TestRun;
19 import mockit.internal.util.MethodFormatter;
20
21 public final class InvocationArguments {
22 @NonNull
23 final String classDesc;
24 @NonNull
25 final String methodNameAndDesc;
26 @Nullable
27 final String genericSignature;
28 @NonNull
29 private final ArgumentValuesAndMatchers valuesAndMatchers;
30 @Nullable
31 private Member realMethodOrConstructor;
32
33 InvocationArguments(int access, @NonNull String classDesc, @NonNull String methodNameAndDesc,
34 @Nullable String genericSignature, @NonNull Object[] args) {
35 this.classDesc = classDesc;
36 this.methodNameAndDesc = methodNameAndDesc;
37 this.genericSignature = genericSignature;
38 valuesAndMatchers = (access & Access.VARARGS) == 0 ? new ArgumentValuesAndMatchersWithoutVarargs(this, args)
39 : new ArgumentValuesAndMatchersWithVarargs(this, args);
40 }
41
42 @NonNull
43 String getClassName() {
44 return classDesc.replace('/', '.');
45 }
46
47 boolean isForConstructor() {
48 return methodNameAndDesc.charAt(0) == '<';
49 }
50
51 @NonNull
52 public Object[] getValues() {
53 return valuesAndMatchers.values;
54 }
55
56 void setValues(@NonNull Object[] values) {
57 valuesAndMatchers.values = values;
58 }
59
60 public void setValuesWithNoMatchers(@NonNull Object[] argsToVerify) {
61 valuesAndMatchers.setValuesWithNoMatchers(argsToVerify);
62 }
63
64 public void setValuesAndMatchers(@NonNull Object[] argsToVerify, @Nullable List<ArgumentMatcher<?>> matchers) {
65 valuesAndMatchers.setValuesAndMatchers(argsToVerify, matchers);
66 }
67
68 @Nullable
69 public List<ArgumentMatcher<?>> getMatchers() {
70 return valuesAndMatchers.matchers;
71 }
72
73 public void setMatchers(@Nullable List<ArgumentMatcher<?>> matchers) {
74 valuesAndMatchers.matchers = matchers;
75 }
76
77 @NonNull
78 public Object[] prepareForVerification(@NonNull Object[] argsToVerify,
79 @Nullable List<ArgumentMatcher<?>> matchers) {
80 return valuesAndMatchers.prepareForVerification(argsToVerify, matchers);
81 }
82
83 public boolean isMatch(@NonNull Object[] replayArgs, @NonNull Map<Object, Object> instanceMap) {
84 TestRun.enterNoMockingZone();
85 ExecutingTest executingTest = TestRun.getExecutingTest();
86 boolean previousFlag = executingTest.setShouldIgnoreMockingCallbacks(true);
87
88 try {
89 return valuesAndMatchers.isMatch(replayArgs, instanceMap);
90 } finally {
91 executingTest.setShouldIgnoreMockingCallbacks(previousFlag);
92 TestRun.exitNoMockingZone();
93 }
94 }
95
96 @Override
97 public String toString() {
98 MethodFormatter methodFormatter = new MethodFormatter(classDesc, methodNameAndDesc, false);
99 List<String> parameterTypes = methodFormatter.getParameterTypes();
100 String arguments = valuesAndMatchers.toString(parameterTypes);
101 methodFormatter.append(arguments);
102 return methodFormatter.toString();
103 }
104
105 public boolean hasEquivalentMatchers(@NonNull InvocationArguments other) {
106 return valuesAndMatchers.hasEquivalentMatchers(other.valuesAndMatchers);
107 }
108
109 @NonNull
110 Member getRealMethodOrConstructor() {
111 if (realMethodOrConstructor == null) {
112 try {
113 realMethodOrConstructor = new RealMethodOrConstructor(getClassName(), methodNameAndDesc).getMember();
114 } catch (NoSuchMethodException e) {
115 throw new RuntimeException(e);
116 }
117 }
118
119 return realMethodOrConstructor;
120 }
121 }