2012-05-05 20 views
1

Nettyを使用して、UDPメッセージをサーバーに送信するクライアントアプリケーションを作成しています。要するに私は、チャネルにストリームを書き込むために、コードのこの部分を使用しています:未完成のNetty ChannelFutureをシミュレートする方法

ChannelFuture future = channel.write(request, remoteInetSocketAddress); 
future.awaitUninterruptibly(timeout); 
if(!future.isDone()){ 
    //abort logic 
} 

すべてが正常に動作しますが、一つのこと:私は、私は、書き込みが失敗することはできませんようアボートロジックをテストすることができませんよ - つまり、サーバーがダウンしても未来は正常に完了します。書き込み操作は通常約1ミリ秒かかるので、タイムアウトを少しでも設定するとあまり役に立ちません。

私は、await()呼び出しの代わりに非同期モデルを使用するのが望ましいと知っていますが、私のシナリオでは同期が必要で、ある時点でfinnishedになる必要があります。

未完成の未来をどのようにシミュレートできますか?

事前に感謝します。 MM

答えて

1

コードの書き方によっては、mockitoなどの模擬フレームワークを使用できます。これが不可能な場合は、ローカルアドレスにバインドされたデータグラムソケットなどの「接続された」UDPソケットを使用することもできます。あなたが偽のサーバに送った場合、あなたはPortunreachableExceptionかそれに類するものを得るべきです。

+0

はい、モックがかもしれ解決策ですが、私は未来が完了していない本当の理由を見たいと思います。偽のサーバにパケットを送ることはできません。将来は実際に正常に完了します。 – user1318992

+1

あなたの例をもう一度見て、私は上記の答えは本当に質問に一致しないことがわかります。 isDone()を見たいと思っていますか? falseの場合、書き込み操作が完了せず、引き続き正常に実行されるか、失敗した可能性があります。私は盲目的にあなたがisSuccess()を意味すると仮定しました。その場合、ポート1に「0.0.0.0」を送信すると障害が発生します。 –

+0

あなたのご意見ありがとうございます。はい、私はisDone()を見たいと思います。実際に私は生産上の問題があり、私はisDone()が私の場合はfalseを返すことを観察しました。問題は、テスト環境で問題を再現できないことです。 – user1318992

0

ネッティーあなたは、たとえば次のように模擬テストを使用してクラスをモックすることができ、この目的のために使用することができるクラスFailedFutureを持って

ChannelFuture future; 
if(ALWAYS_FAIL) { 
    future = channel.newFailedFuture(new Exception("I failed")); 
else 
    future = channel.write(request, remoteInetSocketAddress); 
関連する問題