Hallo Leute,
Ich habe in meiner Ausbildung heute den Auftrag bekommen einen simplen Webserver in Java zu schreiben.
Soweit macht es auch ne Menge Spass, habe viel neues über die Libraries gelernt und konnte ein wenig Unit-Testing anwenden.
Leider scheitert es nun auch bei den Unit-Tests, da ich gerne testen möchte ob meine ConnectedClient (Mein Wrapper für den Socket [Client Socket]) API auch anständig funktioniert.
ConnectedClient-Klasse:
Dort habe ich 4 Methoden für die Kommunikation mit dem ConnectedClient erstellt. Jeweils zwei zum Empfangen und zwei zum Schreiben an den Client. Und die wider rum unterschieden in Text und Byte Streams.
Nun wollte ich das Ganze testen und zwar wie folgt (Bitte beachtet, dass ich hier noch keine assertion eingebunden habe. Lediglich ein System.out da ich einfach mal sehen wollte ob es überhaupt funktioniert...Ja dazu ist der Test da, aber ich wollte es geloggt haben ):
Problem:
Sobald die Methode connectedClient.receiveFromClientAsCharStream() ausgeführt wird, bleibt er in einer Schleife hängen. Ich habe derweil viel gegoogled und einiges gelesen, jedoch war keiner der Lösungsansätze trivial genug damit ich den direkt erkenne.
Ich hoffe daher, dass das Problem wirklich sehr simplen und einen "Och ja klar"-Effekt hervorruft.
Danke schonmal für jegliche Hilfe!
(Falls ihr mehr Code braucht oder Infos - nur bescheid sagen!)
Gruß Charlie
Ich habe in meiner Ausbildung heute den Auftrag bekommen einen simplen Webserver in Java zu schreiben.
Soweit macht es auch ne Menge Spass, habe viel neues über die Libraries gelernt und konnte ein wenig Unit-Testing anwenden.
Leider scheitert es nun auch bei den Unit-Tests, da ich gerne testen möchte ob meine ConnectedClient (Mein Wrapper für den Socket [Client Socket]) API auch anständig funktioniert.
ConnectedClient-Klasse:
Java:
package com.babiel.azubis.webserver;
import jdk.management.resource.internal.inst.SocketInputStreamRMHooks;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
/**
* Created by xetra11 on 08.01.2016.
*/
public class ConnectedClient {
private Socket clientSocket;
private InputStream fromClientByteReader;
private BufferedReader fromClientTextReader;
private PrintWriter toClientWriter;
private ByteArrayOutputStream toClientByter;
private static final String CLIENT_CONNECTION_ERROR_MESSAGE = "Client could not be accepted.";
public ConnectedClient(Socket socket) {
try {
clientSocket = socket;
fromClientByteReader = clientSocket.getInputStream();
fromClientTextReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
toClientWriter = new PrintWriter(clientSocket.getOutputStream());
toClientByter = new ByteArrayOutputStream();
} catch (Exception exception) {
ServerLogger.log(Level.SEVERE, CLIENT_CONNECTION_ERROR_MESSAGE, exception);
}
}
public void getLocalAddress() {
clientSocket.getLocalAddress();
}
public void getPort() {
clientSocket.getPort();
}
public int receiveFromClientAsByteStream(byte[] givenBuffer, int offset, int length) throws IOException {
return fromClientByteReader.read(givenBuffer, offset, length);
}
public String receiveFromClientAsCharStream() throws IOException {
return fromClientTextReader.readLine();
}
public void sendToClientAsByteStream(byte[] bytes) throws IOException {
toClientByter.write(bytes);
}
public void sendToClientAsText(Object textToSend) {
toClientWriter.println(textToSend);
}
}
Dort habe ich 4 Methoden für die Kommunikation mit dem ConnectedClient erstellt. Jeweils zwei zum Empfangen und zwei zum Schreiben an den Client. Und die wider rum unterschieden in Text und Byte Streams.
Nun wollte ich das Ganze testen und zwar wie folgt (Bitte beachtet, dass ich hier noch keine assertion eingebunden habe. Lediglich ein System.out da ich einfach mal sehen wollte ob es überhaupt funktioniert...Ja dazu ist der Test da, aber ich wollte es geloggt haben ):
Java:
package com.babiel.azubis.webserver;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by p.hoefer on 08.01.2016.
*/
public class ConnectedClientTest {
Socket mockedClient;
ServerSocket mockedServerSocket;
ConnectedClient connectedClient;
InetSocketAddress serverAddress;
public ConnectedClientTest(){
mockedClient = new Socket();
serverAddress = new InetSocketAddress("localhost", WebServer.DEFAULT_PORT);
}
@Before
public void setup() throws IOException {
mockedServerSocket = new ServerSocket(WebServer.DEFAULT_PORT);
}
@After
public void tearDown() throws Exception {
mockedServerSocket.close();;
}
@Test
public void shouldReceiveTextMessageFromMockedServerSocket() throws Exception {
mockedClient.connect(serverAddress);
connectedClient = new ConnectedClient(mockedServerSocket.accept());
connectedClient.sendToClientAsText("TestMessage\r\n");
System.out.println(connectedClient.receiveFromClientAsCharStream());
}
@Test
public void testConnect1() throws Exception {
}
}
Problem:
Sobald die Methode connectedClient.receiveFromClientAsCharStream() ausgeführt wird, bleibt er in einer Schleife hängen. Ich habe derweil viel gegoogled und einiges gelesen, jedoch war keiner der Lösungsansätze trivial genug damit ich den direkt erkenne.
Ich hoffe daher, dass das Problem wirklich sehr simplen und einen "Och ja klar"-Effekt hervorruft.
Danke schonmal für jegliche Hilfe!
(Falls ihr mehr Code braucht oder Infos - nur bescheid sagen!)
Gruß Charlie