Добрый день! Пишу клиент-серверное приложение. Весь код стараюсь покрывать юнит тестами. Единственное, что пока не получается автоматизировать - это одновременный запуск сервера и клиента с обменом каких-то данных. Приходиться каждый раз вручную запускать сервер и клиент и вручную вбивать данные в клиенте, что очень утомляет. Вот примерный набросок, как я это думал реализовать:
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
@BeforeClass
public static void startServer() {
ServerSocket listener = null;
try {
listener = new ServerSocket(5050);
while (true) {
try {
Socket socket = listener.accept();
System.out.println("Client connected");
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
try {
String request = dis.readUTF();
System.out.println(request);
dos.writeUTF(request);
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void checkServerResponse() {
try {
Socket socket = new Socket("127.0.0.1", 5050);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
String request = "Hello";
dos.writeUTF(request);
String serverResponse = dis.readUTF();
Assert.assertEquals("Hello", serverResponse);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Но такой вариант не работает, т. к. на строке Socket socket = listener.accept(); тест зависает. Есть идея запускать сервер и клиент в разных потоках и как-то регулировать ими с помощью семафора, но как это реализовать пока не очень понимаю.
Есть ли какие-то общепринятые подходы к решению таких задач?