错误:*不同*的void方法不能与返回值一起存根

杰夫·鲍曼

存根时ClassOne.methodOne,我收到以下有关错误消息的方法错误消息:即使返回的值ClassOne.methodOne不是空值,也要使用返回值对空方法进行存根该错误似乎与ClassTwo.methodTwo我存根有关ClassOne.methodOne

org.mockito.exceptions.base.MockitoException: 
`'methodTwo'` is a *void method* and it *cannot* be stubbed with a *return value*!
Voids are usually stubbed with Throwables:
    doThrow(exception).when(mock).someVoidMethod();
***

If you're unsure why you're getting above error read on.
Due to the nature of the syntax above problem might occur because:
1. The method you are trying to stub is *overloaded*. Make sure you are calling
   the right overloaded version.
2. Somewhere in your test you are stubbing *final methods*. Sorry, Mockito does not
   verify/stub final methods.
3. A spy is stubbed using `when(spy.foo()).then()` syntax. It is safer to stub
   spies with `doReturn|Throw()` family of methods. More in javadocs for
   Mockito.spy() method.

我的代码:

public class ClassOne {
  private ClassTwo classTwo;

  public boolean methodOne() {
    classTwo.methodTwo();
    return true;
  }
}

我的测试:

when(classOne.methodOne("some string")).thenReturn(true);

为什么会发生这种情况,我该如何解决?

杰夫·鲍曼

当您尝试对Mockito无法覆盖的方法进行存根时,可能会发生这种情况。whenMockito的语法工作方式将它可以检测到的最新调用识别为对存根的方法调用。如果Mockito无法检测到您正在存根的方法调用,但是可以检测到在存根方法的实际实现中发生的对模拟的调用,则可能将该调用误认为存根调用。因此,它认为您正在ClassTwo.methodTwo使用返回值对void方法进行存根,并引发异常。

/* 1 */  when(classOne.methodOne("some string")).thenReturn(true);
/* 2 */  when(              false              ).thenReturn(true);
/* 3 */  (    internal mockito stub object     ).thenReturn(true);

通常,Mockito调用classOne.methodOne,这是模拟中未打桩的方法。Mockito的默认实现检测到该调用,将调用记录为最后收到的调用,并返回false。然后,在上面的步骤2中,Mockito看到对的调用when,而不是将最后一次调用标记为存根,并为thenVerb在步骤3中出现的对的调用做准备但是,在这种情况下,在第一步中,Mockito并未被覆盖methodOne,因此它无法检测到呼叫或记录调用它实际上会调用classOne.methodOne,并且如果与模拟进行了任何交互,那么这些交互将被记录下来,就好像它们在when调用上方的测试中一样步骤2依旧进行,只是Mockito将存根标记为错误的调用,因此步骤3看到thenReturn对void方法的调用

如果使用Matchers,这甚至会更加麻烦,因为如果内部Matcher堆栈上的Matchers数量错误,那么即使测试中的存根调用似乎正确使用了Matchers,也可能会收到InvalidUseOfMatchersException。


当Mockito无法覆盖您正在存根的方法时,就会出现此问题。您需要检查以下各项是否正确:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

jQuery:setInterval不能与each()方法一起使用。“ this”关键字错误或代码错误?

为什么委托事件的通用方法不能与错误消息一起使用

变量的值模型是否只能与静态类型一起使用,而不能与动态类型一起使用?

从Dataframe Cell获取单个值只能与.loc一起使用,而不能与.at一起使用

是否可以将不带参数并返回void的函数指针类型与带参数并返回值的函数一起使用?

与布尔值一起返回值

MockitoException-是* void方法*,*不能*返回值*!

Unicode 字符串不能与 P/Invoke 中的 void 一起使用

Unity CS0308错误:非泛型方法不能与类型参数一起使用

将方法返回值加在一起

为什么nameof不能与CreationAtAction返回语句一起使用

ArrayFormula是否不能与返回数组的自定义函数一起使用?

为什么isblank返回的数组不能与Excel中的match函数一起使用?

类型错误:typing.Any 不能与 isinstance() 一起使用

编译错误:“'<>'不能与匿名类一起使用”

如何修复错误:Cygwin gcc不能与--compiler = mingw32一起使用

HTML Canvas 不能与 React 一起使用,代码没有给出任何错误

GKE错误“代码= 400,消息= IP别名不能与旧版网络一起使用”。

错误:“browserName”不能与“bundleId”功能一起设置 - Appium - iOS

'If语句'不能与PSEXEC一起用于错误级别

Swift,Firebase:`setValue`给出错误“ AnyObject不能与Dictionary Literal一起使用”

Mockito重新存根方法已与thenthrow一起存根

为什么“+”号不能与 printf 一起用于无符号值?

Blazor将输入值绑定到oninput不能与onkeypress一起使用

Terraform-条件运算符不能与列表值一起使用

django查看if语句不能与布尔值一起使用

为什么这个 ngif 不能与布尔值一起正常工作?

雄辩的“选择”方法不能与“使用”方法一起使用

非泛型方法'HttpClient.GetAsync(string)'不能与类型参数一起使用