java - 使用mockito captor捕获发送到方法的参数

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

最佳答案

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

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

关于java - 使用mockito captor捕获发送到方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22724946/

相关文章:

java - 从 MySQL 下载 Android App 数据的有效方法

java - 程序关闭后仍保留在内存中

java - 测试使用同一类中的另一个方法的方法

android - 使用mockito测试void方法

java - 如何使用 Jgit API 检索指定 github 帐户中的存储库列表?

java - 结合字母顺序和自然顺序(又名。用户理智排序)

java - 如何使用 Junit 按顺序运行测试方法

java - json 中的 ObjectMapper.readvalue

java - 对单元测试和 Mockito 感到困惑

java - 使用 junit 测试输入