【问题标题】:Mockito verifies wrong overloaded methodMockito 验证错误的重载方法
【发布时间】:2017-10-19 22:17:12
【问题描述】:

我正在尝试为一个将AsynchronousSocketChannel用作依赖项的类编写单元测试:

final AsynchronousSocketChannel channel = mock(AsynchronousSocketChannel.class);
final Client client = new Client(channel);

client.read();
verify(channel).read(isA(ByteBuffer.class), eq(client), isA(CompletionHandler.class));

但是,我收到以下错误:

Invalid use of argument matchers!
5 matchers expected, 3 recorded:

发生这种情况是因为 AsynchronousSocketChannel.read 有 4 个不同的重载版本,并且出于某种原因 verify 一直选择带有 5 个参数的版本,即使我传递的匹配器与 read(ByteBuffer dst, A attachment, CompletionHandler<Integer,? super A> handler) 的版本匹配。

this answer 中建议这确实是实际编译器的问题,并且可以指示编译器选择正确的重载方法,例如

verify(channel).read(
        ArgumentMatchers.<ByteBuffer>isA(ByteBuffer.class),
        ArgumentMatchers.<Client>eq(client),
        ArgumentMatchers.<CompletionHandler>isA(CompletionHandler.class)
);

但是这样做我总是遇到同样的错误。

知道是否有可能完成这项工作吗?否则我相信我可以只使用 5 个参数重载,将 null 作为额外的 2 个参数传递,但这对我来说有点像 hack。

【问题讨论】:

    标签: java unit-testing mocking mockito overloading


    【解决方案1】:

    您正试图对final method 设定期望。

    public final <A> void read(ByteBuffer dst,
                A attachment,
                CompletionHandler<Integer,? super A> handler)
    

    Mockito 无法在 mock 中覆盖该方法,因此它实际上是在调用真实方法。该方法通过 5 个参数调用重载,并且在该方法中与 mockito 框架进行交互。

    如果您可以使用AsynchronousByteChannel 而不是AsynchronousSocketChannel 构造Client,则可以改用它。这将按您的预期工作,因为该类上的 3 参数重载不是 final

    否则,您(使用 Mockito)所能做的就是设置调用 5 参数重载的预期值。

    【讨论】:

    猜你喜欢
    • 2015-07-16
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    相关资源
    最近更新 更多