使用 mockito 的 mock 嵌套方法调用

2022-08-31 16:03:41

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

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

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

并希望在递归方法调用上获得“foo”,例如

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

我试过了

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

但得到空指针异常

然后我试过了

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

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

我知道我可以创建B,C和D的对象,甚至可以写这样的东西

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

等等。

但是我不能在一次射击中做到这一点吗?任何帮助将不胜感激。


答案 1

添加RETURNS_DEEP_STUBS做到了以下几点:

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

答案 2

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

你的“生产”代码严重违反了德墨忒耳定律:你的A类不应该知道它必须得到一个B才能得到一个C才能得到一个D。

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

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

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

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


推荐