2014-03-28 31 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可以模拟接口上的任何方法,因为接口中不存在终结或可见性问题。