我们正在用Scala和Websockets开发一个应用程序。对于后者,我们使用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的响应
有许多方法可以尝试这样做。问题是,您可能会从服务器获得错误或成功的响应。因此,最好的方法可能是使用某种超时。在过去,我使用过这样的模式(注意,这是未经测试的代码):
...
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作为响应。
当然,超时和睡眠可以根据您的测试用例最小化。