/* * 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.Test; import org.mockito.exceptions.base.MockitoException; import org.mockito.exceptions.misusing.InvalidUseOfMatchersException; import org.mockito.exceptions.misusing.WrongTypeOfReturnValue; import org.mockito.internal.creation.MockSettingsImpl; import org.mockito.internal.invocation.InvocationBuilder; import org.mockito.internal.invocation.InvocationImpl; import org.mockito.internal.invocation.InvocationMatcher; import org.mockito.internal.invocation.MatchersBinder; import org.mockito.internal.progress.ArgumentMatcherStorage; import org.mockito.internal.stubbing.InvocationContainerImpl; import org.mockito.internal.stubbing.StubbedInvocationMatcher; import org.mockito.internal.stubbing.answers.Returns; import org.mockito.internal.verification.VerificationModeFactory; import org.mockito.invocation.Invocation; import org.mockito.listeners.InvocationListener; import org.mockito.listeners.MethodInvocationReport; import org.mockitoutil.TestBase; import java.util.Arrays; import static org.mockito.internal.progress.ThreadSafeMockingProgress.mockingProgress; import static junit.framework.TestCase.assertNull; import static junit.framework.TestCase.fail; import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; @SuppressWarnings({"unchecked", "serial"}) public class MockHandlerImplTest extends TestBase { private StubbedInvocationMatcher stubbedInvocationMatcher = mock(StubbedInvocationMatcher.class); private Invocation invocation = mock(InvocationImpl.class); @Test public void should_remove_verification_mode_even_when_invalid_matchers() throws Throwable { // given Invocation invocation = new InvocationBuilder().toInvocation(); @SuppressWarnings("rawtypes") MockHandlerImpl<?> handler = new MockHandlerImpl(new MockSettingsImpl()); mockingProgress().verificationStarted(VerificationModeFactory.atLeastOnce()); handler.matchersBinder = new MatchersBinder() { public InvocationMatcher bindMatchers(ArgumentMatcherStorage argumentMatcherStorage, Invocation invocation) { throw new InvalidUseOfMatchersException(); } }; try { // when handler.handle(invocation); // then fail(); } catch (InvalidUseOfMatchersException ignored) { } assertNull(mockingProgress().pullVerificationMode()); } @Test(expected = MockitoException.class) public void should_throw_mockito_exception_when_invocation_handler_throws_anything() throws Throwable { // given InvocationListener throwingListener = mock(InvocationListener.class); doThrow(new Throwable()).when(throwingListener).reportInvocation(any(MethodInvocationReport.class)); MockHandlerImpl<?> handler = create_correctly_stubbed_handler(throwingListener); // when handler.handle(invocation); } @Test(expected = WrongTypeOfReturnValue.class) public void should_report_bogus_default_answer() throws Throwable { MockSettingsImpl mockSettings = mock(MockSettingsImpl.class); MockHandlerImpl<?> handler = new MockHandlerImpl(mockSettings); given(mockSettings.getDefaultAnswer()).willReturn(new Returns(AWrongType.WRONG_TYPE)); @SuppressWarnings("unused") // otherwise cast is not done String there_should_not_be_a_CCE_here = (String) handler.handle( new InvocationBuilder().method(Object.class.getDeclaredMethod("toString")).toInvocation() ); } private MockHandlerImpl<?> create_correctly_stubbed_handler(InvocationListener throwingListener) { MockHandlerImpl<?> handler = create_handler_with_listeners(throwingListener); stub_ordinary_invocation_with_given_return_value(handler); return handler; } private void stub_ordinary_invocation_with_given_return_value(MockHandlerImpl<?> handler) { stub_ordinary_invocation_with_invocation_matcher(handler, stubbedInvocationMatcher); } private void stub_ordinary_invocation_with_invocation_matcher(MockHandlerImpl<?> handler, StubbedInvocationMatcher value) { handler.invocationContainerImpl = mock(InvocationContainerImpl.class); given(handler.invocationContainerImpl.findAnswerFor(any(InvocationImpl.class))).willReturn(value); } private MockHandlerImpl<?> create_handler_with_listeners(InvocationListener... listener) { @SuppressWarnings("rawtypes") MockHandlerImpl<?> handler = new MockHandlerImpl(mock(MockSettingsImpl.class)); handler.matchersBinder = mock(MatchersBinder.class); given(handler.getMockSettings().getInvocationListeners()).willReturn(Arrays.asList(listener)); return handler; } private static class AWrongType { public static final AWrongType WRONG_TYPE = new AWrongType(); } }