Mockito:试图监视方法正在调用原始方法

新手上路,请多包涵

我正在使用 Mockito 1.9.0。我想在 JUnit 测试中模拟一个类的单个方法的行为,所以我有

final MyClass myClassSpy = Mockito.spy(myInstance);
Mockito.when(myClassSpy.method1()).thenReturn(myResults);

问题是,在第二行中,实际上正在调用 myClassSpy.method1() ,从而导致异常。我使用模拟的唯一原因是以后,无论何时调用 myClassSpy.method1() ,都不会调用真正的方法,并且将返回 myResults 对象。

MyClass 是一个接口, myInstance 是一个实现,如果这很重要的话。

我需要做什么来纠正这种间谍行为?

原文由 Dave 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 530
2 个回答

让我引用 官方文档

监视真实物体的重要陷阱!

有时不可能使用 when(Object) 来存根间谍。例子:

>  List list = new LinkedList();
> List spy = spy(list);
>
> // Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
> when(spy.get(0)).thenReturn("foo");
>
> // You have to use doReturn() for stubbing
> doReturn("foo").when(spy).get(0);
>
> ```

在你的情况下,它是这样的:

doReturn(resultsIWant).when(myClassSpy).method1();

”`

原文由 Tomasz Nurkiewicz 发布,翻译遵循 CC BY-SA 4.0 许可协议

在我的例子中,使用 Mockito 2.0,我必须将所有 any() 参数更改为 nullable() 以存根真实调用。

原文由 ejaenv 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题