gpt4 book ai didi

java - 错误 : a *different* void method cannot be stubbed with a return value

转载 作者:行者123 更新时间:2023-11-30 08:04:50 31 4
gpt4 key购买 nike

当 stub ClassOne.methodOne 时,我收到以下关于用返回值 stub void 方法的错误消息,即使 ClassOne.methodOne 不是空的。该错误似乎与 ClassTwo.methodTwo 有关,即使我正在对 ClassOne.methodOne 进行 stub 。

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);

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

最佳答案

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

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

通常,Mockito 会调用 classOne.methodOne,这是 mock 上的未 stub 方法。 Mockito 的默认实现检测调用,将调用记录为最后接收到的调用,并返回 false。然后,在上面的第 2 步中,Mockito 看到对 when 的调用,将最后一次调用标记为 stub ,并准备调用第 3 步中出现的 thenVerb . 但是,在这种情况下,在第一步中,Mockito 没有覆盖 methodOne,因此它无法检测到调用或记录调用。它实际上调用了 classOne.methodOne,如果与 mock 有任何交互,这些交互将被记录下来,就像它们在 when 调用上方的测试中一样。第 2 步像以前一样进行,除了 Mockito 标记了对 stub 的错误调用,所以第 3 步看到对 void 方法的 thenReturn 的调用。

如果您使用 Matchers,这可能会更麻烦,因为如果 internal matcher stack 上的 Matchers 数量错误,那么您可能会收到 InvalidUseOfMatchersException,即使测试中的 stub 调用似乎正确使用了匹配器。


当 Mockito 无法覆盖您 stub 的方法时,就会出现此问题。您需要检查以下内容是否全部正确:

  • 类应该是非final,并且不应该有non-public parents .
  • 该方法应该是非static 和非final
  • 实例应该是 Mockito 模拟。请注意,如果它是使用 @InjectMocks 创建的,那么它是一个真正的实现而不是模拟; read more here .
  • 如异常中所述,当对 spy 进行攻击时,use doReturn/doAnswer/doThrow syntax ,因为否则您将在对 when 的调用中调用 spy 的实际方法。

关于java - 错误 : a *different* void method cannot be stubbed with a return value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373877/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com