【问题标题】:Mocking sockets in java with mockito使用 mockito 在 java 中模拟套接字
【发布时间】:2011-03-13 06:34:10
【问题描述】:

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

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

知道我做错了什么吗?

【问题讨论】:

  • 哇,这获得了 1003 次观看,没有赞成票或反对票...难道没有徽章吗?

标签: java sockets mocking mockito


【解决方案1】:

ServerSocket 没有采用 Object 和 int 的绑定重载。它有一个重载,需要一个 SocketAddress 和一个 int。我没有用过 Mockito,但我想你可能需要:

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

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

【讨论】:

  • 抱歉,不够清楚。我知道它为什么不起作用,我不确定如何使它与 mockito 的匹配器一起工作。
  • 对,看来已经解决了。我只是不需要它。如果你问我奇怪的行为,但是嘿,我知道什么?谢谢!
【解决方案2】:

bind 的签名是bind(java.net.SocketAddress)bind(java.net.SocketAddress,int),但你给它的是java.lang.Object

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

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

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

【讨论】:

  • (我不太清楚 Mockito 是如何工作的,但看起来 any() 是参数化的,你可能在使用它的方式上有问题。)
  • 您是否通过静态导入使用 any() ?也许 any(SocketAddress.class) 会有所帮助?
  • doNothing().when(ssc.socket().bind((SocketAddress)any(SocketAddress.class), anyInt()));给了我这里不允许的“无效”类型。但是,我认为这是正确的轨道。
猜你喜欢
  • 2020-03-30
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
相关资源
最近更新 更多