java可以在不考虑参数的情况下模拟方法吗?
我正在尝试使用Mockito测试一些遗留代码
我想在生产中使用一个FooDao
存根,如下所示:
foo = fooDao.getBar(new Bazoo());
我可以写:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
但是明显的问题是getBar()
从来没有使用我为之存根的相同Bazoo
对象调用过。(诅咒那个new
操作符!)
如果我能以一种不管参数如何都返回myFoo
的方式来存根这个方法,我会很高兴。如果做不到这一点,我将听取其他解决方案建议,但我真的希望在有合理的测试覆盖率之前避免更改生产代码
# 1 楼答案
这样使用:
在需要导入
Mockito.Matchers
之前# 2 楼答案
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()
应该适合你的需要还可以考虑为^ {< CD4>}类实现^ {CD2>}和^ {CD3>}。这将使您的代码示例按照您想要的方式工作
# 3 楼答案
另一种选择是依赖于良好的旧式
equals
方法。只要when
mockequals
中的参数与被测试代码中的参数相同,Mockito就会与mock匹配这里有一个例子
然后,假设您知道
someField
的值是什么,您可以这样模拟它优点:这比
any
匹配器更明确。作为代码的审阅者,我一直关注初级开发人员编写的代码中的any
,因为它浏览了他们代码的逻辑以生成所传递的适当对象缺点:有时传递给对象的字段是一个随机ID。在这种情况下,您无法在模拟代码中轻松构造预期的参数对象
另一种可能的方法是使用Mockito的}lambda中,我可以进一步检查Bazo论点。。。也许是为了验证传递给它的ID是否正确。我更喜欢这个,而不是它本身,这样至少可以对这个论点进行一些检查
Answer
对象,该对象可以与when
方法一起使用Answer
允许截取实际调用,检查输入参数并返回模拟对象。在下面的示例中,我使用any
捕获对被模拟方法的任何请求。但是在{总之,我喜欢依赖
equals
(期望参数和实际参数应该相等),如果不可能相等(因为无法预测实际参数的状态),我将求助于Answer
来检查参数# 4 楼答案
或者(为了避免
null
):别忘了导入匹配器(还有许多其他匹配器):
对于Mockito 2.1.0及更新版本:
对于旧版本: