我正在尝试为一个类编写一个单元测试,该类将一个类用作依赖项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 参数重载的期望。