在间谍对象上回答后如何在 Mockito 中执行原始方法

How to execute original method in Mockito after Answer on Spy object

我想知道描述中的事情是否可行以及如何实现。

我知道你可以调用原始方法然后像这样做答案:

when(presenter, "myMethod").doAnswer(<CUSTOMANSWER>)

但我想对它们进行不同的排序,先执行 CUSTOMANSWER,然后调用原始方法。

您永远不会在 Mockito 中看到 when(...).doAnswer()。相反,您会看到以下任一内容,其中包括您描述的 "call real method" 行为。与 Mockito 存根一样,Mockito 将 select 最近的调用链 匹配调用中的方法调用和参数值,并执行链中的每个操作一次直到最后的操作(它将对之后的所有调用执行此操作。

// Normal Mockito syntax assuming "myMethod" is accessible. See caveat below.
when(presenter.myMethod()).thenAnswer(customAnswer).thenCallRealMethod();
// ...or...
doAnswer(customAnswer).doCallRealMethod().when(presenter).myMethod();

话虽如此, that makes this difficult, because after the first doAnswer call all subsequent calls you get a normal Mockito Stubber instance rather than a PowerMockitoStubber instance. The bug 599 被误解了,所以目前您仍然需要自己进行转换。

((PowerMockitoStubber) doAnswer(customAnswer).doCallRealMethod())
     .when(presenter, "myMethod");

对于追随者,实际上可以同时doAnswercallRealMethod...

   doAnswer(new Answer<Object>() {
      public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
        invocationOnMock.callRealMethod(); // this one
        return null;
      }
    }).when(subject).method(...);