| /* |
| * Copyright (c) 2007 Mockito contributors |
| * This program is made available under the terms of the MIT License. |
| */ |
| package org.mockitousage.verification; |
| |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.rules.ExpectedException; |
| import org.mockito.InOrder; |
| import org.mockito.Mock; |
| import org.mockito.exceptions.base.MockitoException; |
| import org.mockito.exceptions.verification.NoInteractionsWanted; |
| import org.mockito.exceptions.verification.VerificationInOrderFailure; |
| import org.mockitousage.IMethods; |
| import org.mockitoutil.TestBase; |
| |
| import static org.mockito.Mockito.*; |
| |
| public class VerificationInOrderWithCallsTest extends TestBase { |
| |
| @Mock private IMethods mockOne; |
| @Mock private IMethods mockTwo; |
| @Rule |
| public ExpectedException exceptionRule = ExpectedException.none(); |
| |
| @Test |
| public void shouldFailWhenMethodNotCalled(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| InOrder verifier = inOrder( mockOne ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| |
| exceptionRule.expect( VerificationInOrderFailure.class ); |
| exceptionRule.expectMessage( "Verification in order failure" ); |
| exceptionRule.expectMessage( "Wanted but not invoked" ); |
| exceptionRule.expectMessage( "mockOne.oneArg(2)" ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 2 ); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldFailWhenMethodCalledTooFewTimes(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| |
| exceptionRule.expect( VerificationInOrderFailure.class ); |
| exceptionRule.expectMessage( "Verification in order failure" ); |
| exceptionRule.expectMessage( "mockOne.oneArg(2)" ); |
| exceptionRule.expectMessage( "Wanted 2 times" ); |
| exceptionRule.expectMessage( "But was 1 time" ); |
| |
| // When |
| verifier.verify( mockOne, calls(2)).oneArg( 2 ); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldFailWhenSingleMethodCallsAreOutOfSequence(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| verifier.verify( mockOne, calls(1)).oneArg( 2 ); |
| |
| exceptionRule.expect( VerificationInOrderFailure.class ); |
| exceptionRule.expectMessage( "Verification in order failure" ); |
| exceptionRule.expectMessage( "Wanted but not invoked" ); |
| exceptionRule.expectMessage( "mockOne.oneArg(1)" ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldFailWhenDifferentMethodCallsAreOutOfSequence(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.voidMethod(); |
| |
| InOrder verifier = inOrder( mockOne ); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| |
| exceptionRule.expect( VerificationInOrderFailure.class ); |
| exceptionRule.expectMessage( "Verification in order failure" ); |
| exceptionRule.expectMessage( "Wanted but not invoked" ); |
| exceptionRule.expectMessage( "mockOne.oneArg(1)" ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldFailWhenMethodCallsOnDifferentMocksAreOutOfSequence(){ |
| // Given |
| mockOne.voidMethod(); |
| mockTwo.voidMethod(); |
| |
| InOrder verifier = inOrder( mockOne, mockTwo ); |
| verifier.verify( mockTwo, calls(1)).voidMethod(); |
| |
| exceptionRule.expect( VerificationInOrderFailure.class ); |
| exceptionRule.expectMessage( "Verification in order failure" ); |
| exceptionRule.expectMessage( "Wanted but not invoked" ); |
| exceptionRule.expectMessage( "mockOne.voidMethod()" ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| |
| // Then - expected exception thrown |
| } |
| |
| |
| @Test |
| public void shouldAllowSequentialCallsToCallsForSingleMethod(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 1 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(2)).oneArg( 2 ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifyNoMoreInteractions(mockOne); |
| verifier.verifyNoMoreInteractions(); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldAllowSequentialCallsToCallsForDifferentMethods(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.voidMethod(); |
| mockOne.voidMethod(); |
| mockOne.oneArg( 1 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(2)).voidMethod(); |
| verifier.verify( mockOne, calls(1)).oneArg(1); |
| verifyNoMoreInteractions(mockOne); |
| verifier.verifyNoMoreInteractions(); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldAllowSequentialCallsToCallsForMethodsOnDifferentMocks(){ |
| // Given |
| mockOne.voidMethod(); |
| mockTwo.voidMethod(); |
| mockTwo.voidMethod(); |
| mockOne.voidMethod(); |
| |
| InOrder verifier = inOrder( mockOne, mockTwo ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| verifier.verify( mockTwo, calls(2)).voidMethod(); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| verifyNoMoreInteractions(mockOne); |
| verifyNoMoreInteractions(mockTwo); |
| verifier.verifyNoMoreInteractions(); |
| |
| // Then - no exception thrown |
| } |
| |
| |
| @Test |
| public void shouldAllowFewerCallsForSingleMethod(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(1)).oneArg( 2 ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(1)).oneArg( 2 ); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldNotVerifySkippedCallsWhenFewerCallsForSingleMethod(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 1 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(1)).oneArg( 2 ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| |
| exceptionRule.expect( NoInteractionsWanted.class ); |
| |
| // When |
| verifyNoMoreInteractions( mockOne ); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldNotVerifySkippedCallsInInOrderWhenFewerCallsForSingleMethod(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 2 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(1)).oneArg( 2 ); |
| |
| exceptionRule.expect( VerificationInOrderFailure.class ); |
| exceptionRule.expectMessage( "No interactions wanted here" ); |
| |
| // When |
| verifier.verifyNoMoreInteractions(); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldAllowFewerCallsForDifferentMethods(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.voidMethod(); |
| mockOne.voidMethod(); |
| mockOne.oneArg( 1 ); |
| mockOne.voidMethod(); |
| |
| InOrder verifier = inOrder( mockOne ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldNotVerifySkippedCallsWhenFewerCallsForDifferentMethods(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.voidMethod(); |
| mockOne.voidMethod(); |
| mockOne.oneArg( 1 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| |
| exceptionRule.expect( NoInteractionsWanted.class ); |
| |
| // When |
| verifyNoMoreInteractions( mockOne ); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldNotVerifySkippedCallsInInOrderWhenFewerCallsForDifferentMethods(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.voidMethod(); |
| mockOne.voidMethod(); |
| |
| InOrder verifier = inOrder( mockOne ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| |
| exceptionRule.expect( VerificationInOrderFailure.class ); |
| exceptionRule.expectMessage( "No interactions wanted here" ); |
| |
| // When |
| verifier.verifyNoMoreInteractions(); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldAllowFewerCallsForMethodsOnDifferentMocks(){ |
| // Given |
| mockOne.voidMethod(); |
| mockTwo.voidMethod(); |
| mockTwo.voidMethod(); |
| mockOne.voidMethod(); |
| mockTwo.voidMethod(); |
| |
| InOrder verifier = inOrder( mockOne, mockTwo ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| verifier.verify( mockTwo, calls(1)).voidMethod(); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| verifier.verify( mockTwo, calls(1)).voidMethod(); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldNotVerifySkippedCallsWhenFewerCallsForMethodsOnDifferentMocks(){ |
| // Given |
| mockOne.voidMethod(); |
| mockTwo.voidMethod(); |
| mockTwo.voidMethod(); |
| mockOne.voidMethod(); |
| |
| InOrder verifier = inOrder( mockOne, mockTwo ); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| verifier.verify( mockTwo, calls(1)).voidMethod(); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| |
| exceptionRule.expect(NoInteractionsWanted.class); |
| |
| // When |
| verifyNoMoreInteractions( mockTwo ); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldNotVerifySkippedCallsInInOrderWhenFewerCallsForMethodsOnDifferentMocks(){ |
| // Given |
| mockOne.voidMethod(); |
| mockTwo.voidMethod(); |
| mockTwo.voidMethod(); |
| |
| InOrder verifier = inOrder( mockOne, mockTwo ); |
| verifier.verify( mockOne, calls(1)).voidMethod(); |
| verifier.verify( mockTwo, calls(1)).voidMethod(); |
| |
| exceptionRule.expect( VerificationInOrderFailure.class ); |
| exceptionRule.expectMessage( "No interactions wanted here" ); |
| |
| // When |
| verifier.verifyNoMoreInteractions(); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldVerifyWithCallsAfterUseOfTimes(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 1 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| |
| // When |
| verifier.verify( mockOne, times(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(2)).oneArg( 2 ); |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldVerifyWithCallsAfterUseOfAtLeast(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 2 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| |
| // When |
| verifier.verify( mockOne, atLeast(1)).oneArg( 1 ); |
| verifier.verify( mockOne, calls(2)).oneArg( 2 ); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldVerifyWithTimesAfterUseOfCalls(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 1 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, times(2)).oneArg( 2 ); |
| verifier.verify( mockOne, times(1)).oneArg( 1 ); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldVerifyWithAtLeastAfterUseOfCalls(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 2 ); |
| mockOne.oneArg( 1 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, atLeast(1)).oneArg( 2 ); |
| verifier.verify( mockOne, atLeast(1)).oneArg( 1 ); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldVerifyWithTimesAfterCallsInSameChunk(){ |
| // Given |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 1 ); |
| mockOne.oneArg( 1 ); |
| |
| InOrder verifier = inOrder( mockOne ); |
| |
| // When |
| verifier.verify( mockOne, calls(1)).oneArg( 1 ); |
| verifier.verify( mockOne, times(2)).oneArg( 1 ); |
| verifier.verifyNoMoreInteractions(); |
| |
| // Then - no exception thrown |
| } |
| |
| @Test |
| public void shouldFailToCreateCallsWithZeroArgument(){ |
| // Given |
| InOrder verifier = inOrder( mockOne ); |
| exceptionRule.expect( MockitoException.class ); |
| exceptionRule.expectMessage( "Negative and zero values are not allowed here" ); |
| |
| // When |
| verifier.verify( mockOne, calls(0)).voidMethod(); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldFailToCreateCallsWithNegativeArgument(){ |
| // Given |
| InOrder verifier = inOrder( mockOne ); |
| exceptionRule.expect( MockitoException.class ); |
| exceptionRule.expectMessage( "Negative and zero values are not allowed here" ); |
| |
| // When |
| verifier.verify( mockOne, calls(-1)).voidMethod(); |
| |
| // Then - expected exception thrown |
| } |
| |
| @Test |
| public void shouldFailToCreateCallsForNonInOrderVerification(){ |
| // Given |
| mockOne.voidMethod(); |
| exceptionRule.expect( MockitoException.class ); |
| exceptionRule.expectMessage( "calls is only intended to work with InOrder" ); |
| |
| // When |
| verify( mockOne, calls(1)).voidMethod(); |
| |
| // Then - expected exception thrown |
| } |
| } |