2017-02-03 13 views
1

У меня есть приложение, которое предоставляет конечные точки сервера Websocket/SockJS/Stomp и хочет запустить тесты JUnit, которые запускают клиент (клиент Java STOMP, также из Spring) против него, протестировать «отправку» функций.Self-Connect to Websocket Весенний сервер из теста JUnit

У меня есть тест, как

public void measureSpeedWithWebsocket() throws Exception { 
    final Waiter subscribeWaiter = new Waiter(); 

    new Thread(() -> { 
     // Prepare connection 
     WebsocketClient listener = new WebsocketClient("/mytopic/stomp"); 
     try { 
      listener.connectAndSubscribe(); 
      subscribeWaiter.resume(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    }).start(); 
    subscribeWaiter.await(); // Wait for connection. 

Здесь я использовал официанта из https://github.com/jhalterman/concurrentunit, что эффект в основном, чтобы задержать основной поток теста до вторичного нить вызова резюме(). Это, вероятно, неправильно, потому что Spring-сервер, который работает в контексте должен реагировать

Я получаю следующую ошибку

[INFO ] 2017-02-03 12:36:12.402 [Thread-19] WebsocketClient - Listening 
[INFO ] 2017-02-03 12:36:12.403 [Thread-19] WebsocketClient - Connecting to ws://localhost:8083/user... 
2017-02-03 12:36:14.097 ERROR 9956 --- [  Thread-19] o.s.w.socket.sockjs.client.SockJsClient : Initial SockJS "Info" request to server failed, url=ws://localhost:8083/user 
    org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:8083/user/info": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:633) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:595) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    at org.springframework.web.socket.sockjs.client.RestTemplateXhrTransport.executeInfoRequestInternal(RestTemplateXhrTransport.java:138) ~[spring-websocket-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    at org.springframework.web.socket.sockjs.client.AbstractXhrTransport.executeInfoRequest(AbstractXhrTransport.java:155) ~[spring-websocket-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    at org.springframework.web.socket.sockjs.client.SockJsClient.getServerInfo(SockJsClient.java:286) ~[spring-websocket-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    at org.springframework.web.socket.sockjs.client.SockJsClient.doHandshake(SockJsClient.java:254) ~[spring-websocket-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    at org.springframework.web.socket.messaging.WebSocketStompClient.connect(WebSocketStompClient.java:274) [spring-websocket-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    at org.springframework.web.socket.messaging.WebSocketStompClient.connect(WebSocketStompClient.java:255) [spring-websocket-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    (...) 
    at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_74] 
Caused by: java.net.ConnectException: Connection refused: connect 

Как я могу сделать правильный тест, который «самостоятельно подключает» на веб-сайт, предлагаемый моим приложением Spring Boot?

+1

Если вы используете что-то вроде '@SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT)' в своем тесте, убедитесь, что вы действительно используете правильный порт. Сообщение об ошибке в вашем журнале предполагает, что вы жестко закодировали порт в URI (число выглядит просто как ^^). Вы получите именно ту стеклу, если порт неверен. Spring предоставляет средства для обнаружения порта, см. [Здесь] (https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-discover-the-http-port-at- во время выполнения). – Fencer

ответ

2

Если вы используете Spring Boot, то вам повезло :). Вот пример http://rafaelhz.github.io/testing-websockets/, как вы можете протестировать веб-сокеты, которые отлично работают в Spring Boot и могут вам помочь. Я пытаюсь сделать то же самое в Spring MVC, но, к сожалению, это не работает в Spring MVC.