private <T> MockData<T> createMethodInvocationControl( final String mockName, Class<T> type, Method[] methods, boolean isSpy, Object delegator, MockSettings mockSettings) { final MockSettingsImpl settings; if (mockSettings == null) { // We change the context classloader to the current CL in order for the Mockito // framework to load it's plugins (such as MockMaker) correctly. final ClassLoader originalCL = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(MockCreator.class.getClassLoader()); try { settings = (MockSettingsImpl) Mockito.withSettings(); } finally { Thread.currentThread().setContextClassLoader(originalCL); } } else { settings = (MockSettingsImpl) mockSettings; } if (isSpy) { settings.defaultAnswer(Mockito.CALLS_REAL_METHODS); } settings.setMockName(new MockNameImpl(mockName)); settings.setTypeToMock(type); InternalMockHandler mockHandler = new MockHandlerFactory().create(settings); MethodInterceptorFilter filter = new PowerMockMethodInterceptorFilter(mockHandler, settings); final T mock = new ClassImposterizer(new InstantiatorProvider().getInstantiator(settings)) .imposterise(filter, type); ClassLoader classLoader = mock.getClass().getClassLoader(); if (classLoader instanceof MockClassLoader) { MockClassLoader mcl = (MockClassLoader) classLoader; mcl.cache(mock.getClass()); } final MockitoMethodInvocationControl invocationControl = new MockitoMethodInvocationControl( filter, isSpy && delegator == null ? new Object() : delegator, mock, methods); return new MockData<T>(invocationControl, mock); }