2010-07-08 3 views
2

Je suis en train de se moquer de l'appel suivant:prises Mocking en java avec Mockito

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

donc je peux tester ce que le reste du code fait quand cela ne fonctionne pas de façon prévisible. Je l'utilise dans mon cas de test:

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

Cependant, ce qui précède ne compilent pas avec:

[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 

Toute idée de ce que je fais mal?

+0

WOW, cela a eu 1003 vues sans upvote ou downvote ... N'y a-t-il pas un badge pour ça? – Sardathrion

Répondre

1

ServerSocket n'a aucune surcharge de liaison qui prend un objet et un int. Il a une surcharge qui prend un SocketAddress et un int. Je ne l'ai pas utilisé Mockito, mais je pense que vous pourriez avoir besoin:

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

EDIT: La dernière erreur est parce que vous essayez de passer au vide lorsque la méthode. Le docs note, "méthodes vides sur les simulacres ne font rien par défaut.", De sorte que vous ne pouvez pas besoin de cette ligne du tout.

+0

Désolé, n'était pas assez clair. Je sais pourquoi ça ne marche pas, je ne sais pas comment le faire fonctionner avec les allumettes de mockito. – Sardathrion

+0

Juste, cela semble l'avoir résolu. Je n'en avais juste pas besoin. Comportement étrange si vous me demandez mais bon, qu'est-ce que je sais? Merci! – Sardathrion

1

Les signatures pour bind sont bind(java.net.SocketAddress) ou bind(java.net.SocketAddress,int), mais vous lui donnez un java.lang.Object.

Si vous êtes sûr que le type d'exécution retourné par any() est un java.net.SocketAddress, vous pouvez jeter:

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

(Bien sûr, si ce n'est pas, vous aurez un ClassCastException.)

+0

(Je ne suis pas sûr du fonctionnement de Mockito, mais il semble que any() soit paramétré, vous avez probablement quelque chose de mal dans la façon dont vous l'utilisez.) – Bruno

+0

Utilisez-vous any() via une importation statique? Peut-être tout (SocketAddress.class) aiderait? – Bruno

+0

doNothing(). When (ssc.socket(). Bind ((SocketAddress) any (SocketAddress.class), anyInt())); me donne un type 'void' non autorisé ici. Cependant, je pense que c'est la bonne voie. – Sardathrion