websocket java 测试_如何测试Java EE7 Websocket

本文使用Java EE 7的API实现了WebSocket及客户端,为确保代码更改后仍有效,想实现可在构建服务器运行的测试。给出了服务器端点、客户端端点及当前测试代码,当前测试在本地可行,但在构建服务器无法完成,询问有无更简单的测试方法。

我使用

Java EE 7提供的api实现了一个WebSocket.此外,我已经实现了一个请求我的WebSocket没有任何问题的客户端.为了确保在执行某些代码更改时这仍然有效,我想实现也可以在构建服务器上运行的测试,例如,jenkinsCI不仅在当地.我正在使用maven.

这是我的服务器端点:

import javax.enterprise.context.ApplicationScoped;

import javax.websocket.*;

import javax.websocket.server.ServerEndpoint;

import java.io.IOException;

import java.util.Collections;

import java.util.HashSet;

import java.util.Set;

@ApplicationScoped

@ServerEndpoint("/example")

public class WebSocket {

private final Set sessions = Collections.synchronizedSet(new HashSet<>());

@OnOpen

public void open(Session session) {

sessions.add(session);

}

@OnClose

public void close(Session session) {

sessions.remove(session);

}

@OnError

public void onError(Throwable error) {

//TODO do something

}

@OnMessage

public void handleMessage(String message, Session session) throws IOException {

session.getBasicRemote().sendText("Hello "+message+"!");

}

}

这是我的客户端端点:

import javax.websocket.*;

import java.io.IOException;

import java.net.URI;

@ClientEndpoint

public class WebsocketClient {

private String uri = "ws://localhost:8181//example";

private Session userSession = null;

private String answer;

public WebsocketClient() {

try {

WebSocketContainer container = ContainerProvider

.getWebSocketContainer();

container.connectToServer(this, new URI(uri));

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public boolean isClosed() {

return userSession == null || !userSession.isOpen();

}

@OnOpen

public void onOpen(Session userSession) {

this.userSession = userSession;

}

@OnClose

public void onClose(Session userSession, CloseReason reason) {

this.userSession = null;

}

@OnMessage

public void onMessage(String message) {

this.answer = message;

}

public String getAnswer() {

return answer;

}

public void sendMessage(String message) {

if (userSession != null && userSession.isOpen())

try {

this.userSession.getBasicRemote().sendText(message);

} catch (IOException e) {

e.printStackTrace();

}

else {

System.out.println("Session closed!");

}

}

public void reset() {

this.answer = null;

}

}

我还有一些在使用CDI的构建服务器上测试的其他类.为了能够使用CDI和其他应用程序容器功能,我在版本7.0.0-M3中使用带有apache TomeEE / OpenEJB的EJBContainerRunner启动嵌入式TomEE运行我的测试并在之后关闭它.使用这种方法我没有要调用的URL.这适用于例如JAX-RS REST服务,您可以在测试中调用类方法并检查响应.但是你如何用WebSockets做这样的事情呢?由于缺少Session,我不能简单地调用方法.

我目前的测试看起来像这样:

import org.apache.openejb.junit.jee.EJBContainerRunner;

import org.junit.Test;

import org.junit.runner.RunWith;

import java.net.SocketException;

import static org.hamcrest.MatcherAssert.assertThat;

import static org.hamcrest.Matchers.equalTo;

import static org.hamcrest.Matchers.is;

@RunWith(EJBContainerRunner.class)

public class TestWebsocket {

private WebsocketClient socket;

@Test

public void test() throws SocketException {

String answer = requestSynchronous("Java");

assertThat(answer, is(equalTo("Hello Java!")));

}

public String requestSynchronous(String message) throws SocketException {

if (socket == null || socket.isClosed()) {

socket = new WebsocketClient();

}

socket.reset();

socket.sendMessage(message);

String answer = null;

int i = 0;

while (answer == null && i < 10000) {

try {

answer = socket.getAnswer();

Thread.sleep(1);

i++;

} catch (InterruptedException e) {

e.printStackTrace();

}

}

if (answer != null)

return answer;

else throw new SocketException("Connection timeout");

}

}

这可以在我的本地机器上运行TomEE,例如tomee-maven-plugin.但是这种方法无法在构建服务器上完成.有没有比配置特殊端口或设置虚拟机进行测试更简单的方法?

提前致谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值