| /* |
| * Copyright (c) 2007 Mockito contributors |
| * This program is made available under the terms of the MIT License. |
| */ |
| package org.mockito.internal.handler; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.mockito.ArgumentMatchers; |
| import org.mockito.Mock; |
| import org.mockito.Spy; |
| import org.mockito.exceptions.base.MockitoException; |
| import org.mockito.internal.creation.MockSettingsImpl; |
| import org.mockito.invocation.Invocation; |
| import org.mockito.listeners.InvocationListener; |
| import org.mockito.listeners.MethodInvocationReport; |
| import org.mockito.mock.MockCreationSettings; |
| import org.mockito.junit.MockitoJUnitRunner; |
| import org.mockito.stubbing.Answer; |
| |
| import java.text.ParseException; |
| import java.util.ArrayList; |
| |
| import static org.assertj.core.api.Assertions.assertThat; |
| import static org.junit.Assert.fail; |
| import static org.mockito.BDDMockito.given; |
| import static org.mockito.BDDMockito.willThrow; |
| import static org.mockito.Matchers.any; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.verify; |
| |
| |
| @RunWith(MockitoJUnitRunner.class) |
| @SuppressWarnings("unchecked") |
| public class InvocationNotifierHandlerTest { |
| private static final String SOME_LOCATION = "some location"; |
| private static final RuntimeException SOME_EXCEPTION = new RuntimeException(); |
| private static final OutOfMemoryError SOME_ERROR = new OutOfMemoryError(); |
| private static final Answer<?> SOME_ANSWER = mock(Answer.class); |
| |
| |
| @Mock private InvocationListener listener1; |
| @Mock private InvocationListener listener2; |
| @Spy private CustomListener customListener; |
| |
| @Mock private Invocation invocation; |
| @Mock private MockHandlerImpl<ArrayList<Answer<?>>> mockHandler; |
| |
| private InvocationNotifierHandler<ArrayList<Answer<?>>> notifier; |
| |
| @Before |
| public void setUp() throws Exception { |
| notifier = new InvocationNotifierHandler<ArrayList<Answer<?>>>( |
| mockHandler, |
| (MockCreationSettings<ArrayList<Answer<?>>>) new MockSettingsImpl<ArrayList<Answer<?>>>().invocationListeners(customListener, listener1, listener2) |
| ); |
| } |
| |
| @Test |
| public void should_notify_all_listeners_when_calling_delegate_handler() throws Throwable { |
| // given |
| given(mockHandler.handle(invocation)).willReturn("returned value"); |
| |
| // when |
| notifier.handle(invocation); |
| |
| // then |
| verify(listener1).reportInvocation(new NotifiedMethodInvocationReport(invocation, "returned value")); |
| verify(listener2).reportInvocation(new NotifiedMethodInvocationReport(invocation, "returned value")); |
| } |
| |
| @Test |
| public void should_notify_all_listeners_when_called_delegate_handler_returns_ex() throws Throwable { |
| // given |
| Exception computedException = new Exception("computed"); |
| given(mockHandler.handle(invocation)).willReturn(computedException); |
| |
| // when |
| notifier.handle(invocation); |
| |
| // then |
| verify(listener1).reportInvocation(new NotifiedMethodInvocationReport(invocation, (Object) computedException)); |
| verify(listener2).reportInvocation(new NotifiedMethodInvocationReport(invocation, (Object) computedException)); |
| } |
| |
| @Test(expected = ParseException.class) |
| public void should_notify_all_listeners_when_called_delegate_handler_throws_exception_and_rethrow_it() throws Throwable { |
| // given |
| ParseException parseException = new ParseException("", 0); |
| given(mockHandler.handle(invocation)).willThrow(parseException); |
| |
| // when |
| try { |
| notifier.handle(invocation); |
| fail(); |
| } finally { |
| // then |
| verify(listener1).reportInvocation(new NotifiedMethodInvocationReport(invocation, parseException)); |
| verify(listener2).reportInvocation(new NotifiedMethodInvocationReport(invocation, parseException)); |
| } |
| } |
| |
| @Test |
| public void should_report_listener_exception() throws Throwable { |
| willThrow(new NullPointerException()).given(customListener).reportInvocation(any(MethodInvocationReport.class)); |
| |
| try { |
| notifier.handle(invocation); |
| fail(); |
| } catch (MockitoException me) { |
| assertThat(me.getMessage()) |
| .contains("invocation listener") |
| .contains("CustomListener") |
| .contains("threw an exception") |
| .contains("NullPointerException"); |
| } |
| } |
| |
| @Test |
| public void should_delegate_all_MockHandlerInterface_to_the_parameterized_MockHandler() throws Exception { |
| notifier.getInvocationContainer(); |
| notifier.getMockSettings(); |
| notifier.setAnswersForStubbing(new ArrayList<Answer<?>>()); |
| |
| verify(mockHandler).getInvocationContainer(); |
| verify(mockHandler).getMockSettings(); |
| verify(mockHandler).setAnswersForStubbing(ArgumentMatchers.<Answer<?>>anyList()); |
| } |
| |
| private static class CustomListener implements InvocationListener { |
| public void reportInvocation(MethodInvocationReport methodInvocationReport) { |
| // nop |
| } |
| } |
| } |