| /* |
| * 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.exceptions.Reporter;
|
| import org.mockito.internal.InternalMockHandler;
|
| import org.mockito.internal.listeners.NotifiedMethodInvocationReport;
|
| import org.mockito.internal.stubbing.InvocationContainer;
|
| import org.mockito.invocation.Invocation;
|
| import org.mockito.invocation.MockHandler;
|
| import org.mockito.listeners.InvocationListener;
|
| import org.mockito.mock.MockCreationSettings;
|
| import org.mockito.stubbing.Answer;
|
| import org.mockito.stubbing.VoidMethodStubbable;
|
|
|
| import java.util.List;
|
|
|
| /**
|
| * 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, InternalMockHandler<T> {
|
|
|
| private List<InvocationListener> invocationListeners;
|
| private InternalMockHandler<T> mockHandler;
|
|
|
| public InvocationNotifierHandler(InternalMockHandler<T> 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) {
|
| new Reporter().invocationListenerThrewException(listener, listenerThrowable);
|
| }
|
| }
|
| }
|
|
|
| private void notifyMethodCallException(Invocation invocation, Throwable exception) {
|
| for (InvocationListener listener : invocationListeners) {
|
| try {
|
| listener.reportInvocation(new NotifiedMethodInvocationReport(invocation, exception));
|
| } catch(Throwable listenerThrowable) {
|
| new Reporter().invocationListenerThrewException(listener, listenerThrowable);
|
| }
|
| }
|
| }
|
|
|
| public MockCreationSettings getMockSettings() {
|
| return mockHandler.getMockSettings();
|
| }
|
|
|
| public VoidMethodStubbable<T> voidMethodStubbable(T mock) {
|
| return mockHandler.voidMethodStubbable(mock);
|
| }
|
|
|
| public void setAnswersForStubbing(List<Answer> answers) {
|
| mockHandler.setAnswersForStubbing(answers);
|
| }
|
|
|
| public InvocationContainer getInvocationContainer() {
|
| return mockHandler.getInvocationContainer();
|
| }
|
|
|
| }
|