加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在Mockito中调用实际方法,但拦截结果

发布时间:2020-12-15 01:08:05 所属栏目:Java 来源:网络整理
导读:简化一下,我们的系统有两个部分. “我们的”部分,反过来使用由另一个团队(在相同的代码库中)实现的较低级别部分.我们有一个相当复杂的功能测试设置,我们将入口点包装在间谍对象的较低层.在积极的测试中,我们使用该级别的实际实现,但是我们模拟了应该因某些预

简化一下,我们的系统有两个部分. “我们的”部分,反过来使用由另一个团队(在相同的代码库中)实现的较低级别部分.我们有一个相当复杂的功能测试设置,我们将入口点包装在间谍对象的较低层.在积极的测试中,我们使用该级别的实际实现,但是我们模拟了应该因某些预定义错误而失败的调用.

现在我正在尝试添加对更复杂场景的支持,我想为基础级别的调用添加一个人工延迟(显然是假的时钟).为此,我想定义一个模拟,它将(1)调用实际实现(2)获取返回的结果Future对象,并将其与自定义函数相结合,该函数将相应地注入延迟.所以理想情况下我希望有类似的东西:

doAnswer(invocationOnMock -> 
    { 
      result = call real method on mySpy; 
      return Futures.combile(result,myFunction);
    }).when(mySpy).myMethod();

我怎样才能实现它?

最佳答案
至于我,最简单的方法就是在初始化Spy对象时保存读取对象的链接:

Foo realFoo = new Foo();
Foo spyFoo = Mockito.spy(realFoo);

现在你可以像这样存根:

doAnswer(invocation -> realFoo.getSome() + "spyMethod").when(spyFoo).getSome();

另一种方法是调用invocation.callRealMethod():

doAnswer(invocation -> invocation.callRealMethod() + "spyMethod").when(spyFoo).getSome();

但在这种情况下,只要invocation.callRealMethod()返回Object,您可能需要转换返回值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读