2010-07-08 6 views
2

Я пытаюсь издеваться следующий вызов:Mocking розетки в Java с Mockito

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 

Любая идея, что я делаю неправильно?

+0

WOW, это получило 1003 просмотров без перевыпуска или downvote ... Разве нет значка для этого? – Sardathrion

ответ

1

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

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

EDIT: последняя ошибка в том, что вы пытаетесь передать пустоту в при вызове метода. docs note, "void методы на mocks ничего не делают по умолчанию.", Поэтому вам может не понадобиться эта строка вообще.

+0

Извините, не было достаточно ясно. Я знаю, почему он не работает, я не уверен, как заставить его работать с макетами mockito. – Sardathrion

+0

Правильно, похоже, решили. Мне это просто не нужно. Странное поведение, если вы спросите меня, но эй, что я знаю? Спасибо! – Sardathrion

1

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

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

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

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

+0

(Я не совсем уверен, как работает Mockito, но похоже, что any() параметризирован, вы, вероятно, ошиблись в том, как вы его используете.) – Bruno

+0

Вы используете any() через статический импорт? Может быть, любой (SocketAddress.class) поможет? – Bruno

+0

doNothing(). Когда (ssc.socket(). Bind ((SocketAddress) any (SocketAddress.class), anyInt())); дает мне тип 'void', который здесь не разрешен. Однако, я думаю, что это правильный путь. – Sardathrion