xmen-5
xmen-5

Reputation: 1906

verifying the order of multiple methods call using Mockito

I have a class Person that has two values, age and name, I'm doing some tests using Mockito for learning purpose.

My test method looks like:

        @Test()
        public void testFive(){
            Person mockedPerson = Mockito.mock(Person.class);
            Mockito.when(mockedPerson.getAge()).thenReturn(1,2,3);
            Mockito.when(mockedPerson.getName()).thenReturn("1","2","3");

            InOrder inOrder = Mockito.inOrder(mockedPerson);

            mockedPerson.getAge();
            mockedPerson.getAge();
            mockedPerson.getAge();

            mockedPerson.getName();
            mockedPerson.getName();
            mockedPerson.getName();

            inOrder.verify(mockedPerson).getAge();
            inOrder.verify(mockedPerson).getAge();
            inOrder.verify(mockedPerson).getAge();
            inOrder.verify(mockedPerson).getName();
            inOrder.verify(mockedPerson).getName();
            inOrder.verify(mockedPerson).getName();
        }

I need to test that the getAge() method was called three times, and followed by three call to the getName() method.

I'm getting this exception:

org.mockito.exceptions.verification.VerificationInOrderFailure: Verification in order failure: person.getAge(); Wanted 1 time:

Upvotes: 4

Views: 1855

Answers (1)

orirab
orirab

Reputation: 3343

Your verifications should be like this:

        inOrder.verify(mockedPerson, times(3)).getAge();
        inOrder.verify(mockedPerson, times(3)).getName();

If you had more calls in the test, it should be this way:

    @Test
    public void testFive(){
        Person mockedPerson = Mockito.mock(Person.class);
        Mockito.when(mockedPerson.getAge()).thenReturn(1,2,3,4);
        Mockito.when(mockedPerson.getName()).thenReturn("1","2","3");

        InOrder inOrder = Mockito.inOrder(mockedPerson);

        mockedPerson.getAge();
        mockedPerson.getAge();
        mockedPerson.getAge();

        mockedPerson.getName();
        mockedPerson.getName();
        mockedPerson.getName();

        mockedPerson.getAge();


        inOrder.verify(mockedPerson, times(3)).getAge();
        inOrder.verify(mockedPerson, times(3)).getName();
        inOrder.verify(mockedPerson, times(1)).getAge();
    }

What happens is that calling verify with no second argument verifies 1 call only (as if you wrote times(1)), and since you called 3 times it fails.

This is why I like to always add the times(x), it makes things explicit.

Upvotes: 4

Related Questions