मैंने जावा ईई 7 के साथ प्रदान की गई एपीआई का उपयोग करके एक वेबसाकेट लागू किया है। इसके अतिरिक्त मैंने एक क्लाइंट लागू किया है जो बिना किसी समस्या के मेरे वेबसाकेट का अनुरोध करता है। यह सुनिश्चित करने के लिए कि कुछ कोड परिवर्तन करते समय यह काम करता रहता है, मैं परीक्षणों को कार्यान्वित करना चाहता हूं जो कि बिल्ड सर्वर पर भी चलाए जा सकते हैं जैसे उदा। जेनकींस सीआई और न केवल स्थानीय रूप से। मैं मेवेन का उपयोग कर रहा हूँ।जावा ईई 7 वेबसाइट्स का परीक्षण कैसे करें
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<Session> 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+"!");
}
}
यहाँ मेरे मुवक्किल endpoint है::
import javax.websocket.*;
import java.io.IOException;
import java.net.URI;
@ClientEndpoint
public class WebsocketClient {
private String uri = "ws://localhost:8181/<some-path>/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 का उपयोग पर परीक्षण कर रहे हैं कुछ अन्य वर्गों है
यहाँ अपने सर्वर endpoint है। सीडीआई और अन्य अनुप्रयोग कंटेनर कार्यक्षमता का उपयोग करने में सक्षम होने के लिए मैं EJBContainerRunner
का उपयोग कर रहा हूं, संस्करण 7.0.0-M3
में अपाचे टोमेई/ओपनईजेबी के साथ जो एक एम्बेडेड टॉमई शुरू करता है, मेरे परीक्षण चलाता है और बाद में इसे बंद कर देता है। इस दृष्टिकोण का उपयोग करने के लिए मेरे पास कॉल करने के लिए एक यूआरएल नहीं है। यह उदाहरण के साथ ठीक काम करता है जेएक्स-आरएस आरईएसटी सेवाएं जहां आप अपने परीक्षणों में बस अपनी कक्षा के तरीकों को कॉल कर सकते हैं और प्रतिक्रियाओं की जांच कर सकते हैं। लेकिन आप वेबसाकेट्स के साथ ऐसा कुछ कैसे करते हैं? मैं लापता 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
। लेकिन यह दृष्टिकोण बिल्ड सर्वर पर नहीं किया जा सकता है। क्या विशेष बंदरगाहों को कॉन्फ़िगर करने या परीक्षण के लिए वर्चुअल मशीन सेट करने से कोई आसान तरीका है?
अग्रिम धन्यवाद!