View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
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 }