/* * 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 implements MockHandler { private final List invocationListeners; private final MockHandler mockHandler; public InvocationNotifierHandler(MockHandler mockHandler, MockCreationSettings 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 getMockSettings() { return mockHandler.getMockSettings(); } public InvocationContainer getInvocationContainer() { return mockHandler.getInvocationContainer(); } }