/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockitousage.stacktrace; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.exceptions.verification.VerificationInOrderFailure; import org.mockito.junit.MockitoJUnitRunner; import org.mockitousage.IMethods; import org.mockitoutil.TestBase; import static junit.framework.TestCase.fail; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; //This is required to make sure stack trace is well filtered when runner is ON @RunWith(MockitoJUnitRunner.class) public class PointingStackTraceToActualInvocationInOrderTest extends TestBase { @Mock private IMethods mock; @Mock private IMethods mockTwo; private InOrder inOrder; @Before public void setup() { inOrder = inOrder(mock, mockTwo); first(); second(); third(); fourth(); } private void first() { mock.simpleMethod(1); } private void second() { mockTwo.simpleMethod(2); } private void third() { mock.simpleMethod(3); } private void fourth() { mockTwo.simpleMethod(4); } @Test public void shouldPointStackTraceToPreviousVerified() { inOrder.verify(mock, atLeastOnce()).simpleMethod(anyInt()); inOrder.verify(mockTwo).simpleMethod(anyInt()); try { inOrder.verify(mock).simpleMethod(999); fail(); } catch (VerificationInOrderFailure e) { assertThat(e).hasMessageContaining("fourth("); } } @Test public void shouldPointToThirdMethod() { inOrder.verify(mock, atLeastOnce()).simpleMethod(anyInt()); try { inOrder.verify(mockTwo).simpleMethod(999); fail(); } catch (VerificationInOrderFailure e) { assertThat(e).hasMessageContaining("third("); } } @Test public void shouldPointToSecondMethod() { inOrder.verify(mock).simpleMethod(anyInt()); inOrder.verify(mockTwo).simpleMethod(anyInt()); try { inOrder.verify(mockTwo, times(3)).simpleMethod(999); fail(); } catch (VerificationInOrderFailure e) { assertThat(e).hasMessageContaining("second("); } } @Test public void shouldPointToFirstMethodBecauseOfTooManyActualInvocations() { try { inOrder.verify(mock, times(0)).simpleMethod(anyInt()); fail(); } catch (VerificationInOrderFailure e) { assertThat(e).hasMessageContaining("first("); } } @Test public void shouldPointToSecondMethodBecauseOfTooManyActualInvocations() { inOrder.verify(mock).simpleMethod(anyInt()); try { inOrder.verify(mockTwo, times(0)).simpleMethod(anyInt()); fail(); } catch (VerificationInOrderFailure e) { assertThat(e).hasMessageContaining("second("); } } @Test public void shouldPointToFourthMethodBecauseOfTooLittleActualInvocations() { inOrder.verify(mock).simpleMethod(anyInt()); inOrder.verify(mockTwo).simpleMethod(anyInt()); inOrder.verify(mock).simpleMethod(anyInt()); try { inOrder.verify(mockTwo, times(3)).simpleMethod(anyInt()); fail(); } catch (VerificationInOrderFailure e) { assertThat(e).hasMessageContaining("fourth("); } } }