使用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( “富”)时(a.getB()GETC()GETD()…)。;

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

我知道我可以创建B,C和D的对象,或者甚至可以写出类似的东西

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

等等。

但我不能一次性做到这一点? 任何帮助,将不胜感激。

来自评论:

添加RETURNS_DEEP_STUBS就可以了:

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

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

你的“生产”代码严重违反了得墨忒耳法则 :你的A级应该知道它必须得到一个B才能得到一个C得到一个D.

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

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

因此,不要“修复”您的测试设置,而应考虑解决实际问题 。 这就是您的生产代码设计

而对于记录:getB()。getC()。getD()不是“递归”调用; 它更像是一种“流畅”的方法调用链接。 如上所述:这不是一件好事。