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 実装をシングルスレッドにするか、2 つのスレッドを接続する最良の方法は何ですか? または、それを行う別のさらに良い方法はありますか?最終的に、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 に答える