Mockito验证方法的调用次数

有时候,我们关心的是某个方法是否被执行过,或者被执行了多少次。

对于这种情况,可以使用Mockito提供的verify()方法来进行准确的检查。

本篇内容基于Mockito 2.28.2版本,马上开始学习吧。

检查方法是否被调用过

先创建一个mock对象,执行一些mock方法。

然后调用verify()方法,传入mock对象。再通过verify()方法返回的mock对象,调用已执行过的方法进行验证。

Mockito.verify(mockObject).someMethod("some args");

来看一个简单的例子,先执行add("once")方法,再检查是否调用过该方法。

@Test
public void verify() {
    List mockedList = Mockito.mock(List.class);
    mockedList.add("once");
    Mockito.verify(mockedList).add("once");
}

如果试图检查未经过mock的方法,将会抛出异常。

Mockito.verify(mockedList).add("twice");

抛出异常:

Wanted but not invoked:
list.add("twice");
...

检查调用次数

准确来说,上面的例子检查的是,是否执行了一次add("once")方法。而不是0次,或者大于1次。

Mockito.verify()提供了第2个参数,用于传入一个验证模式,用来实现验证方法是否被调用了指定的次数。

@Test
public void verifyTimes() {
    List mockedList = Mockito.mock(List.class);

    // 执行一些mock方法调用
    mockedList.add("once");

    mockedList.add("twice");
    mockedList.add("twice");

    mockedList.add("three times");
    mockedList.add("three times");
    mockedList.add("three times");

    // 下面两种用法是等价的
    Mockito.verify(mockedList).add("once"); // 默认使用Mockito.times(1)
    Mockito.verify(mockedList, Mockito.times(1)).add("once");

    // 检查指定方法及入参,是否被调用了指定次数
    Mockito.verify(mockedList, Mockito.times(2)).add("twice");
    Mockito.verify(mockedList, Mockito.times(3)).add("three times");
}

其中,verify(mockedList)等价于verify(mockedList, Mockito.times(1)),用于检查方法是否只被调用了一次。

Mockito.times()方法,用于指定需要验证的调用次数。

最后的两个verify验证,分别用于检查指定的方法是否被调用了2次和3次。

确认没有被调用过

如果验证模式传入Mockito.never(),可以用于确认方法是否没有被调用过。

Mockito.never()内部实现很简单,直接返回Mockito.times(0),即调用了0次。

@Test
public void verifyNever() {
    List mockedList = Mockito.mock(List.class);
    mockedList.add("once");
    // 检查是否没执行过该操作. never()相当于times(0)
    Mockito.verify(mockedList, Mockito.never()).add("never happened");
}

最多和最少调用次数

除了可以精确的检查方法被调用的次数,还可以检查方法最多被调用了多少次,和最少被调用了多少次。

@Test
public void verifyAtMostOrLeast() {
    List mockedList = Mockito.mock(List.class);

    // 执行一些mock方法调用
    mockedList.add("once");

    mockedList.add("twice");
    mockedList.add("twice");

    mockedList.add("three times");
    mockedList.add("three times");
    mockedList.add("three times");

    Mockito.verify(mockedList, Mockito.atMostOnce()).add("once"); // 最多调用了1次
    Mockito.verify(mockedList, Mockito.atLeastOnce()).add("three times"); // 最少调用了1次
    Mockito.verify(mockedList, Mockito.atLeast(2)).add("three times"); // 最少调用了2次
    Mockito.verify(mockedList, Mockito.atMost(5)).add("three times"); // 最多调用了5次

//  Mockito.verify(mockedList, Mockito.never()).add("once"); // 异常
//  Mockito.verify(mockedList, Mockito.atLeast(3)).add("twice"); // 异常
//  Mockito.verify(mockedList, Mockito.atMost(2)).add("three times"); // 异常
}

同样的,对于检查不通过的,会抛出异常。

小结

当我们关心的是某个方法是否被调用过,或者被调用的次数是否符合预期时,可以指定验证模式来实现。

验证模式,具体来说有6种:

Mockito.verify(mock, Mockito.times(5)).someMethod("被调用了5次");

Mockito.verify(mock, Mockito.never()).someMethod("没有被调用过");

Mockito.verify(mock, Mockito.atMostOnce()).someMethod("最多被调用了1次");

Mockito.verify(mock, Mockito.atLeastOnce()).someMethod("最少被调用了1次");

Mockito.verify(mock, Mockito.atLeast(2)).someMethod("最少被调用了2次");

Mockito.verify(mock, Mockito.atMost(3)).someMethod("最多被调用了3次");

参考

https://javadoc.io/doc/org.mockito/mockito-core/2.28.2/org/mockito/Mockito.html


---转载本站文章请注明作者和出处 996极客教程(996geek.com),请勿用于任何商业用途---

留下评论