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