Как правильно протестировать конечную точку Spring WebSocket?

avatar
kidfrom
8 августа 2021 в 17:46
149
0
0

Моя цель — протестировать конечную точку Spring WebSocket с помощью JUnit assertEquals для MyBinaryHandler. В настоящее время я могу протестировать только MyTextHandler.

Мой ожидаемый результат: если я отправлю двоичное сообщение на сервер, сервер вернет "Hello World" в двоичном формате.

Мой фактический результат: клиент java.net.http.WebSocket не может обработать "Hello World" в двоичном ответе от сервера, из-за чего тест задержался на неопределенный срок.

Что я сделал:

  1. Протестируйте его в браузере, используя JavaScript WebSocket API, и он получит ответ в двоичном виде от сервера, и я могу сделать alert(String.fromCharCode.apply(null, new Uint8Array(event.data)));.

Я предполагаю, что в клиенте java.net.http.WebSocket есть ошибка.

Application.java

package com.example.spring;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.BinaryMessage;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.handler.BinaryWebSocketHandler;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;

@Configuration
@EnableAutoConfiguration
@EnableWebSocket
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Component
  public static class MyWebSocketConfigurer implements WebSocketConfigurer {
    private static final Logger logger = LoggerFactory.getLogger(MyWebSocketConfigurer.class);

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
      logger.debug("add handler");
      registry.addHandler(new MyTextHandler(), "/text").setAllowedOrigins("*");
      registry.addHandler(new MyBinaryHandler(), "/binary").setAllowedOrigins("*");
    }

  }

  @Component
  public static class MyTextHandler extends TextWebSocketHandler {
    private static final Logger logger = LoggerFactory.getLogger(MyTextHandler.class);

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
      logger.debug(message.getPayload());
      session.sendMessage(new TextMessage("Hello World"));
    }
  }

  @Component
  public static class MyBinaryHandler extends BinaryWebSocketHandler {
    private static final Logger logger = LoggerFactory.getLogger(MyBinaryHandler.class);

    @Override
    public void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws IOException {
      logger.debug(new String(message.getPayload().array()));
      session.sendMessage(new BinaryMessage("Hello World".getBytes(), true));
    }
  }
}

ApplicationTest.java

package com.example.spring;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.WebSocket;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

class ApplicationTest {
  @Test
  void testMyTextHandler() {
    final String[] dataz = new String[1];

    WebSocket.Listener listener = new WebSocket.Listener() {
      @Override
      public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) {
        dataz[0] = data.toString();
        webSocket.request(1);
        return null;
      }
    };

    WebSocket client = HttpClient.newHttpClient().newWebSocketBuilder().buildAsync(URI.create("ws://localhost:8080/text"), listener).join();

    client.sendText("Send Text", true);

    while (dataz[0] == null) {
    }

    Assertions.assertEquals("Hello World", dataz[0]);
  }

  @Test
  void testMyBinaryHandler() {
    final String[] dataz = new String[1];

    WebSocket.Listener listener = new WebSocket.Listener() {
      @Override
      public CompletionStage<?> onBinary(WebSocket webSocket, ByteBuffer data, boolean last) {
        dataz[0] = new String(data.array());
        webSocket.request(1);
        return null;
      }
    };

    WebSocket client = HttpClient.newHttpClient().newWebSocketBuilder().buildAsync(URI.create("ws://localhost:8080/binary"), listener).join();

    client.sendBinary(ByteBuffer.wrap("Send Binary".getBytes()), true);

    while (dataz[0] == null) {
    }

    Assertions.assertEquals("Hello World", dataz[0]);
  }
}
Источник

Ответы (0)