View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
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 }