Mockito验证错误的重载方法



我正在尝试为一个类编写一个单元测试,该类将一个类用作依赖项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) 匹配的版本。

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

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

但是这样做,我不断收到相同的错误。

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

您正在尝试对final方法设定期望。

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

Mockito 无法在模拟中重写该方法,因此它实际上是在调用真正的方法。该方法使用 5 个参数调用重载,正是在该方法中它与 mockito 框架交互。

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

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

相关内容

  • 没有找到相关文章

最新更新