【问题标题】:How can I get invocations per method from a Mockito mock?如何从 Mockito 模拟中获取每个方法的调用?
【发布时间】:2021-02-10 16:55:57
【问题描述】:

我想从 Mockito 模拟中获取每个给定方法的调用次数。

假设我为它声明了一个模拟和两个存根:

when(mock.methodA()).thenReturn(..);
when(mock.methodB()).thenReturn(..);

我可以执行Mockito.mockingDetails(mock).getInvocations() 之类的操作,但它会返回所有调用的集合。我只想为methodA 获得一些调用。

【问题讨论】:

    标签: java unit-testing junit mockito


    【解决方案1】:

    尝试使用verify(),例如:

    verify(mock, times(N)).methodA();
    verify(mock, times(N)).methodB();
    

    N 检查调用编号时。

    要获取有关特定方法的数据,请仅使用thats:

     new DefaultMockingDetails(service).getInvocations()
                        .stream()
                        .map(InvocationOnMock::getMethod)
                        .filter(s -> s.getName().equals("methodName"))
                        .collect(toList())
    

    此方法将返回该模拟的集合调用。

    更多信息见here

    【讨论】:

    • 是的,这可以正常工作,但不幸的是不会返回调用次数。就我而言,我明确需要获取调用次数来构建更复杂的断言。
    • 我改变了我的答案。这就是你所需要的。
    • 我在找到Mockito.mockingDetails(mock).getInvocations()的问题中提到。这仍将返回两个方法的调用集合。问题是如何仅为methodA 获取调用?
    • 好的。您可以使用新的 DefaultMockingDetails(service).getInvocations() .stream() .map(InvocationOnMock::getMethod) .filter(s -> s.getName().equals("methodName")) .count() ); ...或 .collect(toList()) 我没有发现任何问题 :)
    • @fyrkov “就我而言,我明确需要获取调用次数来构建更复杂的断言。” --- 我'我宁愿坚持JUnitMockito 提供的断言。原因是 UnitTest 最重要的属性之一是它们因正确原因而失败:CuT 不符合预期。当您构建自己的“更复杂的断言”时,它们可能是错误的,而不是 CuT...
    【解决方案2】:

    我想我忽略了Invocation 对象具有继承自超类InvocationOnMockgetMethod 属性。因此,可以执行以下操作:

    Mockito.mockingDetails(mock).getInvocations().stream()
                            .map(InvocationOnMock::getMethod)
                            .map(Method::getName)
                            .filter(methodName -> methodName.equals("methodA"))
    

    不是超级整洁,但可以完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多