使用 mockito 模拟嵌套方法调用

新手上路,请多包涵

我有 4 个类,让我们说 A、B、C、D,每个类都调用另一个类的方法。

现在我模拟了 A 类,并想使用 mockito 模拟一个方法

A a = Mockito.mock(A.class);

并希望在递归方法调用中获得“foo”

a.getB().getC().getD() 应该返回 "foo"

我试过了

当(a.getB().getC().getD()).thenReturn(“foo”);

但是得到了 nullPointerException

然后我试了

doReturn(“foo”).when(a.getB().getC().getD());

然后我得到了 org.mockito.exceptions.misusing.UnfinishedStubbingException:

我知道我可以创建 B、C 和 D 的对象,甚至可以编写类似

B b = mock(B.class) 或 A.setB(new B())

等等。

但我不能一次性完成吗?任何帮助,将不胜感激。

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

阅读 2.2k
2 个回答

添加 RETURNS_DEEP_STUBS 就可以了:

 A a = Mockito.mock(A.class, Mockito.RETURNS_DEEP_STUBS);

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

Abhijeet 的回答在技术上是正确的,但重要的是要理解:你 应该这样做。

您的“生产”代码 严重 违反了 Demeter 法则:您的 A 类 应该知道必须获得 B 才能获得 C 才能获得 D。

这只会导致所有这些类之间的 超紧 耦合。这不是个好主意。

从这个意义上说:您应该看到您需要在这里做一些特殊的事情才能让您的测试工作,这表明您的生产代码做了一些不 正常的 事情。

因此,与其“修复”您的测试设置,不如考虑解决 真正的问题。这就是您的 生产代码 的 _设计_!

郑重声明:getB().getC().getD() 不是“递归”调用;它更像是方法调用的“流畅”链接。正如所说:这 不是 一件好事。

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

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