2016-04-23 12 views
6

मैंने जावा ईई 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। लेकिन यह दृष्टिकोण बिल्ड सर्वर पर नहीं किया जा सकता है। क्या विशेष बंदरगाहों को कॉन्फ़िगर करने या परीक्षण के लिए वर्चुअल मशीन सेट करने से कोई आसान तरीका है?

अग्रिम धन्यवाद!

उत्तर

6

मैं मजाक के बिना मेरे परीक्षण समस्या के लिए एक समाधान मिल गया है, ग्राहक यह session.getBasicRemote().sendText("..."); कॉल करने के लिए की जरूरत नहीं है के लिए एक उत्तर संदेश भेजने के लिए एक वी एम, ...

का उपयोग कर। इसके बजाय वह संदेश लौटाएं जिसे आप भेजना चाहते हैं।

कक्षा में handleMessage विधि के लिए WebSocket परिवर्तन:

@OnMessage 
public String handleMessage(String message){ 
    return "Hello "+message+"!"; 
} 

और परीक्षण करने के लिए सरल:

@RunWith(EJBContainerRunner.class) 
public class TestWebsocket { 

    @Inject 
    private WebSocket socket; 

    @Test 
    public void test() throws SocketException { 
     String answer = socket.handleMessage("Java"); 
     assertThat(answer, is(equalTo("Hello Java!"))); 
    } 
} 

यह दृष्टिकोण वेब अनुप्रयोग कंटेनर के बाहर करने के लिए संदेश भेज नहीं है कि परीक्षण के लिए शुरू किया गया है। यह परीक्षण को संभालने में बहुत आसान बनाता है।

संबंधित मुद्दे