【问题标题】:Calling real method in Mockito, but intercepting the result在 Mockito 中调用真实方法,但拦截结果
【发布时间】:2017-08-23 15:44:32
【问题描述】:

简单一点,我们的系统有两个部分。 “我们的”部分,它又使用另一个团队(在同一代码库中)实现的较低级别的部分。我们有一个相当复杂的功能测试设置,我们将入口点包装到间谍对象中的较低级别。在正面测试中,我们使用该级别的真实实现,但我们模拟应该失败并出现一些预定义错误的调用。

现在我正在尝试添加对更复杂场景的支持,我想为底层级别的调用添加人工延迟(显然是在假时钟上)。为此,我想定义一个模拟,它将 (1) 调用真正的实现 (2) 获取返回的结果 Future 对象并将其与将相应地注入延迟的自定义函数结合起来。所以理想情况下,我想要这样的东西:

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

我怎样才能实现它?

【问题讨论】:

标签: java java-8 mockito


【解决方案1】:

对我来说,最简单的方法就是在初始化 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2011-04-04
    • 2011-06-11
    相关资源
    最近更新 更多