2014-03-28 27 views
0

我想在客戶端提交消息時在CustomMessageConverter類的readInternal()中捕獲參數inputMessage。這裏的客戶端對象不是模擬對象。使用mockito捕獲器捕獲發送給方法的參數

@Component 
public class CustomMessageConverter extends AbstractHttpMessageConverter<Object> { 

... 

    @Override 
    protected Object readInternal(final Class<? extends Object> clazz, final HttpInputMessage inputMessage) throws IOException, 
      HttpMessageNotReadableException { 

      ...do something here... 
    } 
... 
} 

在AbstractHttpMessageConverter類:

@Override 
public final T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException { 
    return readInternal(clazz, inputMessage); 
} 

所以,我寫了一個類的Mockito捕捉到它。

但是,它仍然要去正規的轉換器類。你能建議我做錯了什麼嗎?

@Mock 
CustomMessageConverter mockMessageConverter; 

@Captor 
private ArgumentCaptor<HttpInputMessage> inputMessage; 


@Test 
public void test() { 
    when(mockMessageConverter.read(CustomMessage.class, inputMessage.capture())).thenReturn(null); 
    client.submitMessage(Message); 
    verify(mockMessageConverter, times(1)); 
    Object actual = customConverter.read(CustomMessage.class, inputMessage.getValue()); 
} 

回答

2

limitations of Mockito,你不能存根或驗證final方法。簡而言之,由於該方法標記爲final,因此Java跳過在方法表中查找方法(或者調用Mockito創建的代理對象),並直接編譯調用方法實現。有了這個直接編譯的調用,Mockito就沒有機會用自己的答案代替存根或呼叫跟蹤邏輯進行驗證。

改爲嘗試嘲笑readInternal,或重構代碼以依賴接口而不是實現。 Mockito可以模擬接口上的任何方法,因爲接口中不存在終結或可見性問題。