/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockitousage.stubbing; import org.junit.Before; import org.junit.Test; import org.mockito.exceptions.misusing.CannotVerifyStubOnlyMock; import org.mockito.exceptions.misusing.MissingMethodInvocationException; import org.mockito.exceptions.verification.NoInteractionsWanted; import org.mockitousage.IMethods; import org.mockitoutil.TestBase; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.fail; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; public class BasicStubbingTest extends TestBase { private IMethods mock; @Before public void setup() { mock = mock(IMethods.class); } @Test public void should_evaluate_latest_stubbing_first() throws Exception { when(mock.objectReturningMethod(isA(Integer.class))).thenReturn(100); when(mock.objectReturningMethod(200)).thenReturn(200); assertEquals(200, mock.objectReturningMethod(200)); assertEquals(100, mock.objectReturningMethod(666)); assertEquals("default behavior should return null", null, mock.objectReturningMethod("blah")); } @Test public void should_stubbing_be_treated_as_interaction() throws Exception { when(mock.booleanReturningMethod()).thenReturn(true); mock.booleanReturningMethod(); try { verifyNoMoreInteractions(mock); fail(); } catch (NoInteractionsWanted e) {} } @Test public void should_allow_stubbing_to_string() throws Exception { IMethods mockTwo = mock(IMethods.class); when(mockTwo.toString()).thenReturn("test"); assertThat(mock.toString()).contains("Mock for IMethods"); assertThat(mockTwo.toString()).isEqualTo("test"); } @Test public void should_stubbing_not_be_treated_as_interaction() { when(mock.simpleMethod("one")).thenThrow(new RuntimeException()); doThrow(new RuntimeException()).when(mock).simpleMethod("two"); verifyZeroInteractions(mock); } @Test public void should_stubbing_not_be_treated_as_interaction_verify_no_interactions() { when(mock.simpleMethod("one")).thenThrow(new RuntimeException()); doThrow(new RuntimeException()).when(mock).simpleMethod("two"); verifyNoInteractions(mock); } @Test public void unfinished_stubbing_cleans_up_the_state() { reset(mock); try { when("").thenReturn(""); fail(); } catch (MissingMethodInvocationException e) {} //anything that can cause state validation verifyZeroInteractions(mock); } @Test public void unfinished_stubbing_cleans_up_the_state_verify_no_interactions() { reset(mock); try { when("").thenReturn(""); fail(); } catch (MissingMethodInvocationException e) {} //anything that can cause state validation verifyNoInteractions(mock); } @Test public void should_to_string_mock_name() { IMethods mock = mock(IMethods.class, "mockie"); IMethods mockTwo = mock(IMethods.class); assertThat(mockTwo.toString()).contains("Mock for IMethods"); assertEquals("mockie", "" + mock); } class Foo { public final String toString() { return "foo"; } } @Test public void should_allow_mocking_when_to_string_is_final() throws Exception { mock(Foo.class); } @Test public void test_stub_only_not_verifiable() throws Exception { IMethods localMock = mock(IMethods.class, withSettings().stubOnly()); when(localMock.objectReturningMethod(isA(Integer.class))).thenReturn(100); when(localMock.objectReturningMethod(200)).thenReturn(200); assertEquals(200, localMock.objectReturningMethod(200)); assertEquals(100, localMock.objectReturningMethod(666)); assertEquals("default behavior should return null", null, localMock.objectReturningMethod("blah")); try { verify(localMock, atLeastOnce()).objectReturningMethod(eq(200)); fail(); } catch (CannotVerifyStubOnlyMock e) {} } }