2017-10-19 103 views
1

我試圖寫爲使用作爲依賴的AsynchronousSocketChannel一類單元測試:覈實的Mockito錯重載方法

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個參數,但這對我來說有點像黑客。

回答

3

您正試圖設置對final method的期望值。

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

Mockito無法在模擬中重寫該方法,所以它實際上調用了真正的方法。並且該方法使用5個參數調用重載,並且在該方法中它與mockito框架進行交互。

如果您可以使用AsynchronousByteChannel而不是AsynchronousSocketChannel構建Client,那麼您可以使用它。這將按照您的預期工作,因爲該類上的3參數超載不是final。否則,你所能做的(與Mockito一起的)就是設置5參數過載將被調用的期望值。

+0

或者,更新版本的Mockito 2允許*嘲笑**最終**事物。但這是一個需要特殊「啓用」的實驗性功能。請參閱http://static.javadoc.io/org.mockito/mockito-core/2.10.0/org/mockito/Mockito.html#39 – GhostCat

+0

謝謝!這確實是問題。 – swahnee