java - 在 Mockito 中调用真实方法,但拦截结果

标签 java java-8 mockito

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

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

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);

现在你可以像这样 stub 了:

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

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

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

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

关于java - 在 Mockito 中调用真实方法,但拦截结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45844182/

相关文章:

java - 上下文需要 FLAG_ACTIVITY_NEW_TASK 但我已经设置了该标志

java - Android - getResources() 和 getPackageName() 问题

java - 验证一个 Map 中的所有键/值对是否存在于另一个 Map 中

java - 函数的 Junit 测试

java - JPA:AttributeConverter 的参数化实例

java - 如何获取有关 'feature' 标志警告的更多信息?

datetime - 为什么在 OffsetDateTime 日期格式中使用 'T' - java 8

java - 分解出出现在许多枚举中的方法

java - Mockito 使用 JUnit 5 注入(inject)模拟两次

java - 模拟resttemplate来测试作为restFul客户端的服务