| /* |
| * Copyright (c) 2007 Mockito contributors |
| * This program is made available under the terms of the MIT License. |
| */ |
| package org.mockito.internal.handler; |
| |
| import org.mockito.invocation.InvocationContainer; |
| import org.mockito.invocation.Invocation; |
| import org.mockito.invocation.MockHandler; |
| import org.mockito.listeners.InvocationListener; |
| import org.mockito.mock.MockCreationSettings; |
| |
| import java.util.List; |
| |
| import static org.mockito.internal.exceptions.Reporter.invocationListenerThrewException; |
| |
| /** |
| * Handler, that call all listeners wanted for this mock, before delegating it |
| * to the parameterized handler. |
| * |
| * Also imposterize MockHandlerImpl, delegate all call of InternalMockHandler to the real mockHandler |
| */ |
| class InvocationNotifierHandler<T> implements MockHandler<T> { |
| |
| private final List<InvocationListener> invocationListeners; |
| private final MockHandler<T> mockHandler; |
| |
| public InvocationNotifierHandler(MockHandler<T> mockHandler, MockCreationSettings<T> settings) { |
| this.mockHandler = mockHandler; |
| this.invocationListeners = settings.getInvocationListeners(); |
| } |
| |
| public Object handle(Invocation invocation) throws Throwable { |
| try { |
| Object returnedValue = mockHandler.handle(invocation); |
| notifyMethodCall(invocation, returnedValue); |
| return returnedValue; |
| } catch (Throwable t){ |
| notifyMethodCallException(invocation, t); |
| throw t; |
| } |
| } |
| |
| |
| private void notifyMethodCall(Invocation invocation, Object returnValue) { |
| for (InvocationListener listener : invocationListeners) { |
| try { |
| listener.reportInvocation(new NotifiedMethodInvocationReport(invocation, returnValue)); |
| } catch(Throwable listenerThrowable) { |
| throw invocationListenerThrewException(listener, listenerThrowable); |
| } |
| } |
| } |
| |
| private void notifyMethodCallException(Invocation invocation, Throwable exception) { |
| for (InvocationListener listener : invocationListeners) { |
| try { |
| listener.reportInvocation(new NotifiedMethodInvocationReport(invocation, exception)); |
| } catch(Throwable listenerThrowable) { |
| throw invocationListenerThrewException(listener, listenerThrowable); |
| } |
| } |
| } |
| |
| public MockCreationSettings<T> getMockSettings() { |
| return mockHandler.getMockSettings(); |
| } |
| |
| public InvocationContainer getInvocationContainer() { |
| return mockHandler.getInvocationContainer(); |
| } |
| |
| } |