使用mockito captor捕获发送给方法的参数

时间:2014-03-28 23:30:55

标签: java junit mockito

我想在客户端提交消息时捕获CustomMessageConverter类的readInternal()中的参数inputMessage。这里的客户端对象不是模拟对象。

@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());
}

1 个答案:

答案 0 :(得分:2)

根据limitations of Mockito,您无法存根或验证final方法。简而言之,因为该方法被标记为final,所以Java跳过在方法表中查找方法(或调用Mockito创建的Proxy对象)并直接编译方法实现。通过这种直接编译的呼叫,Mockito没有机会用自己的答案替换存根或呼叫跟踪逻辑进行验证。

尝试模拟readInternal,或者重构代码以依赖接口而不是实现。 Mockito可以模拟接口上的任何方法,因为接口中不允许存在终结性或可见性问题。