我们正在使用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会创建一个新线程,只有新线程可以使用response
处理程序访问onMessage
。使websocket实现单线程或连接两个线程以便我们可以在测试用例中访问响应的最佳方法是什么?或者还有另一种更好的方法吗?最后,我们应该能够以某种方式测试websocket的响应。
答案 0 :(得分: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进行回复。
当然,根据您的测试用例,可以最小化超时和睡眠。
此外,您可以将其包装在实用程序方法中。