websocket - 如何使用嵌入式 jetty 对 websocket 进行单元测试?

标签 websocket jetty embedded-jetty

我想使用嵌入式 Jetty 为我的 websocket 服务器端点代码编写 Junit UT 案例。

我尝试了以下链接中解释的内容:
JUnit test with javax.websocket on embedded Jetty throws RejectedExecutionException: NonBlockingThread

我想测试 websocket 的 onMessage 回调。
如果我不使用 server.join() 方法,则连接一打开就关闭。
如果我使用 server.join() 方法加入后没有任何 react 。

下面是我的代码。

服务器启动代码::

public class EmbeddedJettyServer {

private final int port;
    private Server server;

    public EmbeddedJettyServer(int port) {
        this.port = port;
    }

    public void start() throws Exception {
        server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(8080);
        server.addConnector(connector);

        // Setup the basic application "context" for this application at "/"
        // This is also known as the handler tree (in jetty speak)
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);

        try {
            // Initialize javax.websocket layer
            ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(context);

            // Add WebSocket endpoint to javax.websocket layer
            wscontainer.addEndpoint(WebSocketServer.class);
            System.out.println("Begin start");
            server.start();
            server.dump(System.err);
            server.join();


        } catch (Throwable t) {
            t.printStackTrace(System.err);
        }
    }

    public void stop() throws Exception {
        server.stop();
        LOGGER.info("Jetty server stopped");
    }

    public URI getWebsocketUri(Class<WebSocketServer> class1) {         
        return  server.getURI();
    }

}

客户代码:
 @ClientEndpoint()
public class WebSocketClientJetty {

WebSocketContainer container;

public  Session connect(URI uri) throws Exception {
    WebSocketContainer container = ContainerProvider.getWebSocketContainer();

    try {
        // Attempt Connect
          Session session = container.connectToServer(WebSocketClientJetty.class,uri);
       // return container.connectToServer(WebSocketClientJetty.class, uri);
          session.getBasicRemote().sendText("Hello");
            // Close session
          // session.close();

            return session;
    } finally {


    }
}

public  void stop() throws Exception{
    if (container instanceof LifeCycle) {
        ((LifeCycle) container).stop();
    }
}

@OnOpen
public void onWebSocketConnect(Session sess)
{
    System.out.println("Socket Connected: " + sess);
}

@OnMessage
public void onWebSocketText(String message)
{
    System.out.println("Received TEXT message: " + message);
}

@OnClose
public void onWebSocketClose(CloseReason reason)
{
    System.out.println("Socket Closed: " + reason);
}

@OnError
public void onWebSocketError(Throwable cause)
{
    cause.printStackTrace(System.err);
}

}

服务器端点代码:
@ServerEndpoint(value = "/echo",
encoders={JsonEncoder.class}) 
public class WebSocketServer {

private static final Logger LOGGER = 



@OnOpen
public void onOpen(Session session){
    System.out.println("onopen");
    some code....
}



@OnMessage
public void onMessage(String message, Session session) throws IOException{
    System.out.println("onmessage");
    ....
}


@OnClose
public void onClose(Session session){
    System.out.println("onClose");
    ...
}

}

案例:
public class WebSocketJettyTest {

private static EmbeddedJettyServer server;

@ClassRule
public static final ExternalResource integrationServer = new ExternalResource() {
    @Override
    protected void before() throws Throwable {
        System.out.println("Starting...");
        server = new EmbeddedJettyServer(8080);
        server.start();
        System.out.println("Started");
    }
};


@Before
public void setUp() throws Exception {

}

@After
public void shutdown() throws Exception {
    server.stop();
}

@Test
public void testSocket() throws Exception {
    /*URI uri = server.getWebsocketUri(WebSocketServer.class);*/
    URI uri = URI.create("ws://localhost:8080/echo");
    WebSocketClientJetty client = new WebSocketClientJetty();
    Session session = client.connect(uri);
    session.getBasicRemote().sendText("hello");
    Thread.sleep(6000);
    client.stop();
}

}

最佳答案

挂断电话

server.join();

这只会使当前线程等待服务器线程停止。
这让你很难。

关于websocket - 如何使用嵌入式 jetty 对 websocket 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051523/

相关文章:

spring-boot - 如何在带有嵌入式 tomcat 的 Spring Boot 应用程序中运行 hawt.io

html - 如何播放来自 HTML5 websocket 的视频 block ?

java - 如何在单元测试中站起来然后关闭 Solr 实例?

java - Jetty 应用程序中的系统环境变量

java - 反向代理 Java

Jetty 8 设置 "session-timeout"没有 web.xml?

javascript - 网络套接字连接在代理后面关闭

javascript - 带有 node.js promise 的 RPC

node.js - Google Speech-To-Text v2 不接受 Node.JS 中的音频

java - 我如何告诉 Spring Boot 忽略 Jetty 并始终使用 Tomcat?