2

我们正在使用 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 的响应。

4

1 回答 1

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 作为响应。

当然,超时和睡眠可以根据您的测试用例最小化。

此外,您可以将其包装在实用程序方法中。

于 2013-07-09T21:32:23.963 回答