Mockito - 配置一个 mock,这样它将调用一个带有注入参数的方法

Mockito - configure a mock so it will call a method with an injected parameter

我在 class、ConsoleHandler 中有一个方法,我正在监视其中的一个实例:

setIndexManager( IndexManager im );

我想说"when you call this method, call it not with the parameter you want to call it with, but instead with such-and-such a parameter"(即mock对象)

我试过这样做:

    doAnswer( new Answer<Void>(){
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            ((ConsoleHandler)invocation.getMock()).setIndexManager( newMockIM );
            return null;
        }}).when( spyCH ).setIndexManager( any( IndexManager.class ));

...不幸的是这导致了无限循环...

然后我想:好的,如果你可以在 when 子句中指定任何 IndexManager parameter 应该触发这个, except for mockIM, 也许你可以停止无限递归:

    doAnswer( new Answer<Void>(){
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            ((ConsoleHandler)invocation.getMock()).setIndexManager( newMockIM );
            return null;
        }}).when( spyCH ).setIndexManager( not( newMockIM ));

...但是 not 不是这样的...

有什么办法吗?我对可能出现的类似问题做了相当仔细的检查,但找不到任何东西。

当然可以。更改您的存根,以便它仅在提供的参数不是您的模拟时才启动。

所以最后一行是

}}).when(spyCH).setIndexManager(AdditionalMatchers.not( ArgumentMatchers.eq(newMockIM)) );

那么您 Answer 中的调用将不会 re-trigger 存根调用。

备注

我在你添加问题的后半部分之前就回答了,但我相信这没问题。 not 的参数必须是匹配器,但您提供了一个值。所以你所缺少的只是 eq.