【问题标题】:Does when() in Mockito verify invocation with strict parameter?Mockito 中的 when() 是否使用严格参数验证调用?
【发布时间】:2021-02-05 16:56:03
【问题描述】:

我很好奇when(mock.method(SPECIFIC_PARAM)).thenReturn(RETURN_VAlUE); 是否检查方法的调用。或者我应该做verify(mock).method(SPECIFIC_PARAM); 以确保该方法已被调用?

【问题讨论】:

  • 你有没有做过实验试图找出答案?
  • 应该这样做。 @jonrsharpe

标签: java mockito


【解决方案1】:

如果您使用@RunWith(MockitoJUnitRunner.class)@ExtendWith(MockitoExtension.class),如果您提供了未使用的模拟,则在运行测试后会收到 UnnecessaryStubbingException。

如果您愿意,可以通过设置 @MockitoSettings(strictness = Strictness.LENIENT) 来避免这种情况。

但即使出现 UnnecessaryStubbingException,最好还是在测试中进行实际验证以提高可读性。您的“验证”也可以比您的存根更严格,例如:

when(mock.method(anyCollection())).thenReturn(...)
...
mock.method(collection);
...
verify(mock).method(argThat(collection -> collection.size()==1));

【讨论】:

    【解决方案2】:

    基本上when(mock.method(SPECIFIC_PARAM)).thenReturn(RETURN_VAlUE); 表示当在模拟上调用该方法时,将返回指定的值。 when 用于配置模拟,因此它不执行任何验证。是 verify 检查方法是否被调用。

    【讨论】:

      【解决方案3】:

      使用when(..).thenReturn(...) 方法,您在模拟对象上定义规则,在您的特定情况下,当使用输入参数“SPECIFIC_PARAM”调用方法mock.method 时,您将指示模拟对象返回“RETURN_VALUE”。 您实际上并没有在模拟对象上声明任何内容。
      相反,您可以使用 verify(mock) 检查模拟方法的有效调用,就像您在描述中所做的那样。
      例如,当您的方法未被调用时,这是您应该期待的:

      got: <Wanted but not invoked: mock.method(SPECIFIC_PARAM);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-18
        • 2021-07-24
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多