5.1 verify() 方法

除了创建虚拟对象之外,还经常出现另一个有趣的任务——确保被测类调用正确对象的正确方法。此外,他调用了所需的次数,使用正确的参数等。

为此,Mockito 也有一些神奇之处——方法家族Mockito.verify(…)指定方法调用检查的一般规则是:

Mockito.verify(an object).method name(parameter);

例子:

@ExtendWith(MockitoExtension.class)
class VerifyTest {
    @Mock
    List<String> mockList;

    @Test
    public void whenMockAnnotation() {
        //method call
        String name = mockList.get(10);

        // check if the method was called
        Mockito.verify(mockList).get(10);
    }
}

在方法调用过程中,我们设置了参数为10的方法应该在对象上调用的verify()规则。mockitoListget()

5.2 带检查调用次数的verify()方法

有时会有更复杂的验证场景。例如,您不仅需要检查该方法被调用的事实,还需要检查它被调用了 3 次。或者它是在一个循环中被你调用的,因此应该被调用 N 次。

我们不会问这是否可以做到,我们会立即问:这样的规则怎么写下来?再一次,Mockito 没有让我们失望。规则可以指定为:

Mockito.verify(an object,quantity).method name(parameter);

重要的!数量不是类型int,而是可以定义各种模式的特殊对象。您还记得该方法的不同版本吗any()?这里也是一样的——有一些特殊的方法可以用来设置各种场景:

方法 描述
1个 绝不() 永远不应该调用该方法
2个 次(n) n次
3个 至少(n) n次或更多次
4个 至少一次() 1次以上
5个 至多(n) n次或更少次
6个 仅有的() 应该只有一个调用,并且只调用此方法

例子:

String name1 = mockList.get(1);  //method call
String name2 = mockList.get(2);  //method call
String name3 = mockList.get(3);  //method call

//check that the get() method was called 3 times
Mockito.verify(mockList, times(3)).get(anyInt());

您还可以要求,除了指定的方法调用之外,不对对象进行其他引用。有一个规则:

Mockito.verifyNoMoreInteractions(an object);

5.3 方法调用顺序

以前的规则没有以任何方式规定调用方法的顺序。规则必须得到满足,仅此而已。但有些情况下方法调用的顺序很重要,Mockito 对此也有解决方案。

可以使用特殊对象指定严格的方法调用顺序InOrder。首先你需要创建它:

InOrder inOrder = Mockito.inOrder(an object);

然后通过调用方法向其添加规则verify()

例子:


    List<String> mockedList = mock(MyList.class);
    mockedList.size();
    mockedList.add("a parameter");
    mockedList.clear();
 
    InOrder inOrder = Mockito.inOrder(mockedList);
    inOrder.verify(mockedList).size();
    inOrder.verify(mockedList).add("a parameter");
    inOrder.verify(mockedList).clear();

5.4 在 Mockito 中检查异常

抛出异常这一事实的检查方式略有不同。为此,请使用方法assertThrows()。这种检查的一般格式是:

Assertions.assertThrows(exception.class, () -> an object.methodname());

没什么复杂的。

例子:

@ExtendWith(MockitoExtension.class)
class ThenThrowTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        //set the behavior of the method (needed for demonstration purposes only)
        Mockito.when(mockList.size()).thenThrow(IllegalStateException.class);

        //check if an IllegalStateException will be thrown when calling the size method
        assertThrows(IllegalStateException.class, () -> mockList.size());
    }
}