2

我正在尝试模拟以下调用:

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

所以我可以测试其余代码在以可预测的方式失败时的作用。我在我的测试用例中使用它:

ServerSocketChannel ssc = mock(ServerSocketChannel.class);
when(ServerSocketChannel.open()).thenReturn(ssc);
doNothing().when(ssc.socket().bind(any(), anyInt()));

但是,上面的内容不能编译:

[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

知道我做错了什么吗?

4

2 回答 2

1

ServerSocket没有采用 Object 和 int 的绑定重载。它有一个需要 aSocketAddress和一个 int 的重载。我没有使用过 Mockito,但我认为您可能需要:

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

编辑:最新的错误是因为您试图将 void 传递给 when 方法。文档注释,“默认情况下,模拟上的 void 方法什么都不做。”,所以你可能根本不需要这一行。

于 2010-07-08T10:41:24.280 回答
1

的签名bindbind(java.net.SocketAddress)or bind(java.net.SocketAddress,int),但你给它一个java.lang.Object.

如果您确定返回的运行时类型any()是 a java.net.SocketAddress,则可以对其进行强制转换:

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

(当然,如果不是,你会得到一个ClassCastException。)

于 2010-07-08T10:41:55.627 回答