简化一下,我们的系统有两个部分。 "我们" part,它使用由另一个团队(在同一代码库中)实现的较低级别部分。我们有一个相当复杂的功能测试设置,我们将入口点包装在间谍对象的较低层。在积极的测试中,我们使用该级别的实际实现,但是我们模拟了应该因某些预定义错误而失败的调用。
现在我正在尝试添加对更复杂场景的支持,我想为基础级别的调用添加一个人工延迟(显然是假的时钟)。为此,我想定义一个模拟,它将(1)调用实际实现(2)获取返回的结果Future对象,并将其与自定义函数相结合,该函数将相应地注入延迟。所以理想情况下我希望有类似的东西:
doAnswer(invocationOnMock ->
{
result = call real method on mySpy;
return Futures.combile(result, myFunction);
}).when(mySpy).myMethod();
我怎样才能实现它?
答案 0 :(得分:3)
至于我,在初始化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
,您就可能需要转换返回值。