HustleCoder
@HustleCoder

Как писать тесты на клиент-серверное соединение (сокеты)?

Добрый день! Пишу клиент-серверное приложение. Весь код стараюсь покрывать юнит тестами. Единственное, что пока не получается автоматизировать - это одновременный запуск сервера и клиента с обменом каких-то данных. Приходиться каждый раз вручную запускать сервер и клиент и вручную вбивать данные в клиенте, что очень утомляет. Вот примерный набросок, как я это думал реализовать:

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(); тест зависает. Есть идея запускать сервер и клиент в разных потоках и как-то регулировать ими с помощью семафора, но как это реализовать пока не очень понимаю.

Есть ли какие-то общепринятые подходы к решению таких задач?
  • Вопрос задан
  • 315 просмотров
Пригласить эксперта
Ответы на вопрос 1
alfss
@alfss
https://career.habr.com/alfss
Тестировать нужно логику, а не работу стандартных классов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы