Mockito Verify 方法用于检查是否发生了某些行为。我们可以在测试方法代码的末尾使用Mockito验证方法,以确保调用了指定的方法。
本文将会主要介绍一下用法和功能:

  1. Mockito verify
    • Mockito verify()简单示例
    • Mockito验证次数
    • verifyNoMoreInteractions()
    • verifyZeroInteractions()
    • Mockito仅验证方法调用
    • Mockito验证调用顺序
  2. 小结

Mockito verify

  • Mockito verify() 方法也可以用于测试方法调用的数量。我们可以测试模拟方法的确切次数,至少测试一次,至少测试一次。在所有verify()方法调用之后.
  • 我们可以使用 verifyNoMoreInteractions() 来确保所有内容均已通过验证。如果仍然有任何方法验证,它将失败并提供正确的消息。
  • verifyZeroInteractions() 行为与 verifyNoMoreInteractions() 方法相同。
  • 我们可以使用 inOrder() 方法来验证方法调用的顺序。我们可以跳过方法调用,但是要验证的方法必须具有相同的顺序。让我们看一些模拟验证方法示例。
@Test
void test() {
	List<String> mockList = mock(List.class);
	mockList.add("Pankaj");
	mockList.size();
	verify(mockList).add("Pankaj");

如果在模拟列表对象上仅调用一次add(“ Pankaj”),则上述verify方法将通过。与通过verify方法使用times(1)参数调用相同。

verify(mockList, times(1)).size();

如果我们想确保调用了一个方法,但是我们不关心参数,则可以将ArgumentMatchersverify方法一起使用。

verify(mockList).add(anyString());
verify(mockList).add(any(String.class));
verify(mockList).add(ArgumentMatchers.any(String.class));

请注意,org.mockito.Mockito类为Mockito框架中的大多数有用方法提供了静态方法,这有助于我们通过使用import static将其导入来编写流畅的代码。

Mockito验证次数

Mockito verify() method is overloaded, the second one is verify(T mock, VerificationMode mode). We can use it to verify for the invocation count.

verify(mockList, times(1)).size(); //same as normal verify method
verify(mockList, atLeastOnce()).size(); // must be called at least once
verify(mockList, atMost(2)).size(); // must be called at most 2 times
verify(mockList, atLeast(1)).size(); // must be called at least once
verify(mockList, never()).clear(); // must never be called

verifyNoMoreInteractions()

在所有验证方法之后可以使用此方法,以确保所有交互都得到验证。如果模拟对象上存在任何未验证的交互,它将使测试失败。

// all interactions are verified, so below will pass verifyNoMoreInteractions(mockList); mockList.isEmpty(); // isEmpty() is not verified, so below will fail verifyNoMoreInteractions(mockList);

第二次调用verifyNoMoreInteractions()将失败,并显示以下错误消息:

org.mockito.exceptions.verification.NoInteractionsWanted: 
No interactions wanted here:
-> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:36)
But found this interaction on mock 'list':
-> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:34)
For your reference, here is the list of all invocations ([?] - means unverified).
1. -> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:18)
2. -> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:19)
3. [?]-> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:34)

Mockito的一大功能是异常消息,它清楚地指出了测试失败的地方,因此我们可以轻松地对其进行修复。

verifyZeroInteractions()

verifyZeroInteractions()方法的行为与verifyNoMoreInteractions()方法相同。

Map mockMap = mock(Map.class);
Set mockSet = mock(Set.class);
verify(mockList).isEmpty();
verifyZeroInteractions(mockList, mockMap, mockSet);

Mockito验证仅方法调用

如果要验证仅调用了一个方法,则可以将only()与verify方法一起使用。

Map mockMap = mock(Map.class);
mockMap.isEmpty();
verify(mockMap, only()).isEmpty();

Mockito验证调用顺序
我们可以使用InOrder来验证调用顺序。我们可以跳过任何方法进行验证,但是要验证的方法必须以相同的顺序调用。

InOrder inOrder = inOrder(mockList, mockMap);
inOrder.verify(mockList).add("Pankaj");
inOrder.verify(mockList, calls(1)).size();
inOrder.verify(mockList).isEmpty();
inOrder.verify(mockMap).isEmpty();

Mockito verify()方法可用于确保模拟对象方法被调用。如果任何方法调用被错误地删除,则verify方法将引发错误。

1、校验方法是否调用Mockito提供vertify关键字来实现校验方法是否被调用,具体调用如下例子:@Test public void update() throws Exception { boolean result = personService.update(1, "new name"); //验证mockDao的getPer是否被调用 1.@RunWith()+@Mock注解实现 @RunWith(MockitoJUnitRunner.class) public class AccountServiceRunwithTest { @Mock private AccountService accountService; 2. @Befor+Mockito.mock private AccountService accountService; private List<Integer 校验 BetaService.sayHello 中的 AlphaService.eat 方法被调用的时候,作为参数的 EatInfo 对象中属性 food 值为 “饺子”, 属性 address 值为 “你家”校验在 BetaService.sayHello 中方法的调用顺序是 alphaService.init、alphaService.say、alphaService.eat。校验 BetaService.sayHello 中调用了 AlphaService.init 的次数。...... Mockito argument matchers机制 有时候要stubbing或者verify的方法有参数,但是我不关心输入的具体内容,只是完成打桩或者验证,这时候就可以用Mockito提供的argument matchers机制. Mockito.anyInt() 匹配任意 int 参数, Mockito.anyString() 匹配任意 String 参数 Mockito.anySet()匹配任意Set Mockito.any() 则意味 Mockito 是一个针对 Java 的单元测试模拟框架,可以简化单元测试过程中测试上下文对象。它可以做如下事情: 1)模拟方法的返回值、模拟抛出异常 2)验证方法被调用次数、验证方法参数类型 3)捕获方法参数值 4)为真实对象创建一个监控(spy)对象 1)不能 Mock 静态方法 2)不能 Mock private 方法 3)不能 Mock final class   最近公司在使用powermockito进行白盒测试,在这一方面因为刚接触,避免不了要遇到一些坑(问题),这篇文章主要是记录下自己遇到的问题,以便后面可以查阅。 1、使用Powermockito检查某个静态方法调用的次数 1 PowerMockito.mockStatic(Static.class); 2 // use Mockito to set... 内容概要:参考Mockito官方API文档,实践框架每个特性。 适合人群:Mockito入门人员以及想全面熟悉Mockito特性的人员,做到了开箱即用。 能学到什么:“Mockito 4.6.0 + Junit 5”的组合编程。 使用建议:使用前安装好Maven及Java即可,推荐使用VSCode编辑。 import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.List; import static org.hamcre... mockito验证参数Mockito Verify methods are used to check that certain behavior happened. We can use Mockito verify methods at the end of the testing method code to make sure that specified methods are call...