【发布时间】: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