Насмешливые розетки в яве с мокито - PullRequest
2 голосов
/ 08 июля 2010

Я пытаюсь смоделировать следующий вызов:

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 ]

1 голос
/ 08 июля 2010

Подписи для bind: bind(java.net.SocketAddress) или bind(java.net.SocketAddress,int), но вы даете ему java.lang.Object.

Если вы уверены, что тип среды выполнения, возвращаемый any(), является java.net.SocketAddress, вы можете привести его:

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

(Конечно, если это не так, вы получите ClassCastException.)

1 голос
/ 08 июля 2010

ServerSocket не имеет перегрузки связывания, которая принимает Object и int.Он имеет перегрузку, которая принимает SocketAddress и int.Я не использовал Mockito, но думаю, что вам может понадобиться:

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

РЕДАКТИРОВАТЬ: последняя ошибка, потому что вы пытаетесь передать void в метод when. docs note , "void методы для mocks по умолчанию ничего не делают.", Поэтому вам может не понадобиться эта строка вообще.

...