2012-05-05 54 views
1

我正在使用Netty編寫將UDP消息發送到服務器的客戶端應用程序。總之,我使用這段代碼寫的流渠道:如何模擬未完成的Netty ChannelFuture

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

一切工作正常,但有一點:我無法測試中止邏輯,我不能寫失敗即即使服務器關閉,未來也會成功完成。寫操作通常需要大約1 ms,因此設置很少的超時並不會有太大的幫助。

我知道優先的方式是使用異步模型而不是await()調用,但是對於我的場景,我需要它是同步的,我需要確保它在某個時刻完成。

有誰知道我該如何模擬未完成的未來?

非常感謝提前! MM

回答

1

根據您的代碼編寫方式,您可以使用mock框架,如mockito。如果這是不可能的,你也可以使用「連接的」UDP套接字,即綁定到本地地址的數據報套接字。如果你發送給一個虛假服務器,你應該得到PortunreachableException或類似的東西。

+0

是的,嘲諷的可能是一個解決方案,但我希望看到未來未能完成的真正原因。將數據包發送到虛假服務器不起作用 - 未來實際上已經成功完成。 – user1318992

+1

再次看看你的例子,我發現上面的答案並不真正符合這個問題。你確定你也想看看isDone()嗎?如果爲false,則表示寫入操作未完成,可能仍會成功或失敗。我一味地認爲你的意思是isSuccess()。在這種情況下,發送到「0.0.0.0」端口1會導致失敗。 –

+0

感謝您的輸入。是的,我確定我想看看isDone()。其實我有一個生產問題,我觀察到isDone()在我的情況下返回false。問題是我無法在測試環境中重現問題。 – user1318992

0

Netty中有一類FailedFuture可以用於此目的,

例如,你可以使用測試嘲笑你的類,它模擬了以下內容:

ChannelFuture future; 
if(ALWAYS_FAIL) { 
    future = channel.newFailedFuture(new Exception("I failed")); 
else 
    future = channel.write(request, remoteInetSocketAddress);