Mockito 验证错误的重载方法

swa*_*nee 1 java unit-testing overloading mocking 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));
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

Invalid use of argument matchers!
5 matchers expected, 3 recorded:
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为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)
);
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*ner 5

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

public final <A> void read(ByteBuffer dst,
            A attachment,
            CompletionHandler<Integer,? super A> handler)
Run Code Online (Sandbox Code Playgroud)

Mockito 无法重写模拟中的该方法,因此它实际上调用了真实的方法。该方法正在调用具有 5 个参数的重载,并且在该方法中它与mockito 框架进行交互。

如果您可以使用ClientanAsynchronousByteChannel而不是 a 来构造AsynchronousSocketChannel,则可以使用它来代替。这将按您的预期工作,因为 3 参数重载不在final该类中。

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