使用Mockito验证多个方法调用的顺序

时间:2019-06-26 21:22:55

标签: java unit-testing mockito

我有一个Person类,它具有年龄和姓名两个值,我正在使用Mockito进行一些测试以达到学习目的。

我的测试方法如下:

        @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();
        }

我需要测试getAge()方法是否被调用了三次,然后调用了getName()方法了三遍。

我遇到此异常:

  

org.mockito.exceptions.verification.VerificationInOrderFailure:   验证订单失败:person.getAge();想要1次:

1 个答案:

答案 0 :(得分:3)

您的验证应如下所示:

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

如果测试中有更多来电,应该这样:

    @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();
    }

发生的事情是,不带第二个参数的调用verify只能验证1个调用(就像您写了times(1)一样),并且由于调用了3次而失败。

这就是为什么我总是喜欢添加times(x),这使事情变得很明确。