• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2007 Mockito contributors
3  * This program is made available under the terms of the MIT License.
4  */
5 
6 package org.mockito.internal.creation;
7 
8 import org.mockito.cglib.proxy.MethodInterceptor;
9 import org.mockito.cglib.proxy.MethodProxy;
10 import org.mockito.internal.InternalMockHandler;
11 import org.mockito.internal.creation.cglib.CGLIBHacker;
12 import org.mockito.internal.invocation.InvocationImpl;
13 import org.mockito.internal.invocation.MockitoMethod;
14 import org.mockito.internal.invocation.SerializableMethod;
15 import org.mockito.internal.invocation.realmethod.FilteredCGLIBProxyRealMethod;
16 import org.mockito.internal.progress.SequenceNumber;
17 import org.mockito.internal.util.ObjectMethodsGuru;
18 import org.mockito.invocation.Invocation;
19 import org.mockito.invocation.MockHandler;
20 import org.mockito.mock.MockCreationSettings;
21 
22 import java.io.Serializable;
23 import java.lang.reflect.Method;
24 
25 /**
26  * Should be one instance per mock instance, see CglibMockMaker.
27  *
28  *
29  */
30 public class MethodInterceptorFilter implements MethodInterceptor, Serializable {
31 
32     private static final long serialVersionUID = 6182795666612683784L;
33     private final InternalMockHandler handler;
34     CGLIBHacker cglibHacker = new CGLIBHacker();
35     ObjectMethodsGuru objectMethodsGuru = new ObjectMethodsGuru();
36     private final MockCreationSettings mockSettings;
37     private AcrossJVMSerializationFeature acrossJVMSerializationFeature = new AcrossJVMSerializationFeature();
38 
MethodInterceptorFilter(InternalMockHandler handler, MockCreationSettings mockSettings)39     public MethodInterceptorFilter(InternalMockHandler handler, MockCreationSettings mockSettings) {
40         this.handler = handler;
41         this.mockSettings = mockSettings;
42     }
43 
intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)44     public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
45             throws Throwable {
46         if (objectMethodsGuru.isEqualsMethod(method)) {
47             return proxy == args[0];
48         } else if (objectMethodsGuru.isHashCodeMethod(method)) {
49             return hashCodeForMock(proxy);
50         } else if (acrossJVMSerializationFeature.isWriteReplace(method)) {
51             return acrossJVMSerializationFeature.writeReplace(proxy);
52         }
53 
54         MockitoMethodProxy mockitoMethodProxy = createMockitoMethodProxy(methodProxy);
55         cglibHacker.setMockitoNamingPolicy(mockitoMethodProxy);
56 
57         MockitoMethod mockitoMethod = createMockitoMethod(method);
58 
59         FilteredCGLIBProxyRealMethod realMethod = new FilteredCGLIBProxyRealMethod(mockitoMethodProxy);
60         Invocation invocation = new InvocationImpl(proxy, mockitoMethod, args, SequenceNumber.next(), realMethod);
61         return handler.handle(invocation);
62     }
63 
getHandler()64     public MockHandler getHandler() {
65         return handler;
66     }
67 
hashCodeForMock(Object mock)68     private int hashCodeForMock(Object mock) {
69         return System.identityHashCode(mock);
70     }
71 
createMockitoMethodProxy(MethodProxy methodProxy)72     public MockitoMethodProxy createMockitoMethodProxy(MethodProxy methodProxy) {
73         if (mockSettings.isSerializable())
74             return new SerializableMockitoMethodProxy(methodProxy);
75         return new DelegatingMockitoMethodProxy(methodProxy);
76     }
77 
createMockitoMethod(Method method)78     public MockitoMethod createMockitoMethod(Method method) {
79         if (mockSettings.isSerializable()) {
80             return new SerializableMethod(method);
81         } else {
82             return new DelegatingMethod(method);
83         }
84     }
85 }