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
.
我在 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
.