每次调用mock上的方法时,如何让Mockito做某事?

kbo*_*oom 5 testing methods mockito

我正试图用Mockito实现这种行为:

当类型O的对象应用于方法M时,mock应该对类型为O的对象执行另一个方法,将其自身作为参数传递.

毕竟有可能吗?

Wal*_*lls 7

您可以使用某些组合doAnswerwhen组合Mockito.any. doAnswerPowerMockito的一部分,它有助于扩展您可能想要做的许多模拟.

注意,doAnswer用作void函数的示例.对于非空白,您可以使用您的标准Mockito.when(MOCK.call).then(RESULT)

PowerMockito.doAnswer(new org.mockito.stubbing.Answer<Object>() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        //Do whatever to Object O here.
        return null;
    }).when(MOCKOBJECT.methodCall(Mockito.any(O.class)));
Run Code Online (Sandbox Code Playgroud)

然后,它在doAnswer模拟对象上执行有用的功能,并使用when您可以将其分配给任何特定对象类的catch(而不是必须指定它应该期望的确切对象).使用Mockito.any(Class.class))参数作为参数的一部分,当Mockito使用传入的指定类型的任何对象进行方法调用时,Mockito知道要触发你的doWhatever.

  • 你不需要PowerMockito,你可以写(MOCKOBJECT.methodCall(any(O.class))).thenAnswer(new Answer <...>(){...}); (10认同)
  • 不要使用PowerMockito.据我所知,这里没有必要.Mockito有一个`doAnswer`方法,它可以满足你的需要.这里给出的解决方案(除了'Mockito.doAnswer`而不是'PowerMockito.doAnswer`)应该适合你; 如果没有,请查看Mockito文档中的"doAnswer".Tavian给出的解决方案,使用`when`和`thenAnswer`也可以工作,如果你想要存根的方法不是空的. (3认同)
  • `doAnswer()` 是 mockito-core-1.10.19.jar 的一部分,不需要使用 PowerMockito (2认同)