2013-04-26 48 views
2

我們正在開發一個帶有Scala和Websockets的應用程序。對於後者,我們使用Java-Websocket。應用程序本身很好,我們正在編寫單元測試。用於測試的單線程Java Websocket

我們使用的WebSocket類如下

class WebSocket(uri : URI) extends WebSocketClient(uri) { 
    connectBlocking() 
    var response = "" 

    def onOpen(handshakedata : ServerHandshake) { 
    println("onOpen") 
    } 
    def onMessage(message : String) { 
    println("Received: " + message) 
    response = message 
    } 
    def onClose(code : Int, reason : String, remote : Boolean) { 
    println("onClose") 
    } 
    def onError(ex : Exception) { 
    println("onError") 
    } 
} 

一個測試可能是這樣的(僞代碼)

websocketTest { 
    ws = new WebSocket("ws://example.org") 
    ws.send("foo") 
    res = ws.getResponse() 
    .... 
} 

發送和接收數據的作品。但是,問題是連接到websocket會創建一個新線程,只有新線程才能使用onMessage處理程序訪問response。使websocket實現單線程或連接兩個線程以便我們可以訪問測試用例中的響應的最佳方法是什麼?還是有另一種更好的方法呢?最後,我們應該能夠以某種方式測試WebSocket的響應。

回答

0

有很多方法可以嘗試做到這一點。問題在於您可能從服務器收到錯誤或成功的響應。因此,最好的方法可能是使用某種超時。在過去,我已經使用類似的模式(注意,這是未經測試的代碼):

... 
use response in the onMessage like you did 
... 

long start = System.currentTimeMillis(); 
long timeout = 5000;//5 seconds 

while((system.currentTimeMillis()-start)<timeout && response==null) 
{ 
    Thread.sleep(100); 
} 

if(response == null) .. timed out 
else .. do something with the response 

如果你想成爲特別安全的,你可以使用的AtomicReference響應。

當然,根據您的測試案例,超時和睡眠可以最小化。

此外,您可以將其包含在實用程序方法中。