1/* 2 * Copyright (c) 2007 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5package org.mockito.internal.creation; 6 7import org.mockito.cglib.proxy.Callback; 8import org.mockito.cglib.proxy.Factory; 9import org.mockito.exceptions.base.MockitoException; 10import org.mockito.internal.InternalMockHandler; 11import org.mockito.invocation.MockHandler; 12import org.mockito.mock.MockCreationSettings; 13import org.mockito.plugins.MockMaker; 14import org.mockito.internal.creation.jmock.ClassImposterizer; 15 16/** 17 * A MockMaker that uses cglib to generate mocks on a JVM. 18 */ 19public final class CglibMockMaker implements MockMaker { 20 21 public <T> T createMock(MockCreationSettings<T> settings, MockHandler handler) { 22 InternalMockHandler mockitoHandler = cast(handler); 23 new AcrossJVMSerializationFeature().enableSerializationAcrossJVM(settings); 24 return ClassImposterizer.INSTANCE.imposterise( 25 new MethodInterceptorFilter(mockitoHandler, settings), settings.getTypeToMock(), settings.getExtraInterfaces()); 26 } 27 28 private InternalMockHandler cast(MockHandler handler) { 29 if (!(handler instanceof InternalMockHandler)) { 30 throw new MockitoException("At the moment you cannot provide own implementations of MockHandler." + 31 "\nPlease see the javadocs for the MockMaker interface."); 32 } 33 return (InternalMockHandler) handler; 34 } 35 36 public void resetMock(Object mock, MockHandler newHandler, MockCreationSettings settings) { 37 ((Factory) mock).setCallback(0, new MethodInterceptorFilter(cast(newHandler), settings)); 38 } 39 40 public MockHandler getHandler(Object mock) { 41 if (!(mock instanceof Factory)) { 42 return null; 43 } 44 Factory factory = (Factory) mock; 45 Callback callback = factory.getCallback(0); 46 if (!(callback instanceof MethodInterceptorFilter)) { 47 return null; 48 } 49 return ((MethodInterceptorFilter) callback).getHandler(); 50 } 51} 52