/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.powermock.api.mockito.repackaged; import org.mockito.cglib.proxy.Callback; import org.mockito.cglib.proxy.Factory; import org.mockito.exceptions.base.MockitoException; import org.mockito.internal.InternalMockHandler; import org.mockito.internal.creation.instance.InstantiatorProvider; import org.mockito.invocation.MockHandler; import org.mockito.mock.MockCreationSettings; import org.mockito.plugins.MockMaker; /** * A MockMaker that uses cglib to generate mocks on a JVM. */ public class CglibMockMaker implements MockMaker { @Override public <T> T createMock(MockCreationSettings<T> settings, MockHandler handler) { InternalMockHandler mockitoHandler = cast(handler); new AcrossJVMSerializationFeature().enableSerializationAcrossJVM(settings); return new ClassImposterizer(new InstantiatorProvider().getInstantiator(settings)).imposterise( new MethodInterceptorFilter(mockitoHandler, settings), settings.getTypeToMock(), settings.getExtraInterfaces()); } private InternalMockHandler cast(MockHandler handler) { if (!(handler instanceof InternalMockHandler)) { throw new MockitoException("At the moment you cannot provide own implementations of MockHandler." + "\nPlease see the javadocs for the MockMaker interface."); } return (InternalMockHandler) handler; } @Override public void resetMock(Object mock, MockHandler newHandler, MockCreationSettings settings) { ((Factory) mock).setCallback(0, new MethodInterceptorFilter(cast(newHandler), settings)); } @Override public MockHandler getHandler(Object mock) { if (!(mock instanceof Factory)) { return null; } Factory factory = (Factory) mock; Callback callback = factory.getCallback(0); if (!(callback instanceof MethodInterceptorFilter)) { return null; } return ((MethodInterceptorFilter) callback).getHandler(); } }