代码之家  ›  专栏  ›  技术社区  ›  Sardathrion - against SE abuse

用mockito模拟java中的套接字

  •  2
  • Sardathrion - against SE abuse  · 技术社区  · 14 年前

    我试图模拟以下通话:

    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
    

    2 回复  |  直到 14 年前
        1
  •  1
  •   Matthew Flaschen    14 年前

    ServerSocket SocketAddress 还有一个int。我没用过Mockito,但我想你可能需要:

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

    EDIT:最新的错误是因为您试图将void传递给when方法。这个 docs note

        2
  •  1
  •   Bruno    14 年前

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

    any() 是一个 java.net.SocketAddress ,您可以施展:

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

    (当然,如果不是这样,你会得到 ClassCastException .)