当前位置:  开发笔记 > 编程语言 > 正文

使用mockito模拟嵌套方法调用

如何解决《使用mockito模拟嵌套方法调用》经验,为你挑选了2个好方法。

我有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())

等等.

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



1> Abhijeet..:

来自评论:

添加RETURNS_DEEP_STUBS就可以了:

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


或者,如果使用注释:`@Mock(answer = Answers.RETURNS_DEEP_STUBS)`
在RETURNS_DEEP_STUBS的文档中:“好消息,我在网上看到过一天:每次模拟返回模拟时,仙女都会死去。”

2> GhostCat say..:

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

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

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

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

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

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


我完全同意你的看法.但有时为了获得他的面包和黄油,开发人员必须为遗留应用程序编写单元测试用例,并不是每个人都很幸运能再次编写生产代码.
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有