开发者

Mocking sockets in java with mockito

开发者 https://www.devze.com 2023-01-06 06:17 出处:网络
I am trying to mock the following call: s.socket().bind(new InetSocketAddress(serverIPAddress_, serverPort_), 0);

I am trying to mock the following call:

s.socket().bind(new InetSocketAddress(serverIPAddress_, serverPort_), 0);

so I can test what the rest of the code does when this fails in predictable ways. I use this in my test case:

ServerSocketChannel ssc = mock(ServerSocketChannel.class);
when(ServerSocketChannel.open()).thenReturn(ssc);
doNothing().when(ssc.socket().bind(any开发者_如何学运维(), anyInt()));

However, the above does not compile with:

[javac] /home/yann/projects/flexnbd/src/uk/co/bytemark/flexnbd/FlexNBDTest.java:147: cannot find symbol
[javac] symbol  : method bind(java.lang.Object,int)
[javac] location: class java.net.ServerSocket
[javac]       doNothing().when(ssc.socket().bind(any(), anyInt()));
[javac]                                    ^
[javac] 1 error

Any idea what I am doing wrong?


ServerSocket has no bind overload that takes an Object and an int. It has an overload that takes a SocketAddress and an int. I haven't used Mockito, but I think you may need:

doNothing().when(ssc.socket().bind(isA(ServerSocket.class), anyInt()));

EDIT: The latest error is because you're trying to pass void to the when method. The docs note, "void methods on mocks do nothing by default.", so you may not need this line at all.


The signatures for bind are bind(java.net.SocketAddress) or bind(java.net.SocketAddress,int), but you're giving it a java.lang.Object.

If you're sure that the runtime type returned by any() is a java.net.SocketAddress, you can cast it:

ssc.socket().bind((SocketAddress)any(), anyInt())

(Of course, if it's not you'll get a ClassCastException.)

0

精彩评论

暂无评论...
验证码 换一张
取 消