簡體   English   中英

Mockito-配置一個模擬,以便它將調用帶有注入參數的方法

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

我在一個類ConsoleHandler有一個方法,我正在監視該方法的一個實例:

setIndexManager( IndexManager im );

我想說的是“當您調用此方法時,請不要使用您要使用的參數來調用它,而應使用這樣的參數來調用它”(即模擬對象)。

我嘗試這樣做:

    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都應該觸發此操作, 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的呼叫將不會重新觸發存根呼叫。

注意

在您添加問題的下半部分之前,我已經回答了,但是我相信這是可以的。 參數not必須是一個匹配器,但是您已經提供了一個值。 因此,您所缺少的只是eq

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM