Bonjour,
Je code une application Java sous Netbeans qui se connecte à un serveur par java.net.Socket. J'essaye de tester la classe de connexion ComLAN.java (grâce à JUnit).
Par exemple, j'ai une méthode :
Et j'ai donc généré dans ComLANTest.java la méthode de test unitaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public void close() throws IOException { is.close(); os.close(); comSocket.close(); }
J'ai bien sûr plusieurs autres méthodes dans cette classe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 @Test public void testClose() throws Exception { instance = new ComLAN("127.0.0.1", 3000, 1000); System.out.println("close"); instance.close(); assertTrue(!instance.isConnected()); }
Pour que la socket puisse se créer, j'ai simulé un serveur en local qui écoute sur le port 3000 (2eme paramètre du constructeur ComLAN) et que je lance avant de lancer mes tests :
C'est ici que ça bloque.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ServerSocket ss = new ServerSocket(3000); Socket soc = ss.accept(); BufferedReader plec = new BufferedReader( new InputStreamReader(soc.getInputStream()) ); PrintWriter pred = new PrintWriter( new BufferedWriter( new OutputStreamWriter(soc.getOutputStream())), true);
Si je continue avec quelque chose comme :
, dans les méthodes qui n'écrivent rien j'obtiens un NullPointerException, c'est-à-dire que dès que j'ouvre la connexion, le serveur essaye de lire...?!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 while(true){ String str = plec.readLine(); if (str.equals("END")) break; //exemple de réaction attendue par le protocole }
Si au contraire je fais de l'attente active (while(true){}), c'est lorsque j'ai une méthode qui tente d'écrire puis lire la réponse sur le stream que j'obtiens un NoSuchElementException (là c'est compréhensible).
J'aimerais donc simplement que mon serveur lise de façon bloquante pour ne pas être obligé de modifier son comportement pour chaque méthode testée.
J'ai essayé avec un Scanner mais même résultat. Lire directement dans le stream avec InputStream::read() ne me semble pas non plus approprié.
Je ne sais pas si je suis très clair, n'hésitez pas à me le dire.
Merci.
PS : En réalité, le constructeur de ComLAN et la fermeture de l'instance sont dans les @Before et @After de Junit, j'ai simplifié.
Partager