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 }