簡體   English   中英

對使用UDP套接字的代碼進行單元測試的推薦方法是什么?

[英]What is the recommended way to unit test code that uses UDP sockets?

經過一番搜索,我還沒有找到一種定義明確的解決方案來對包含UDP套接字的Java(或任何!)代碼進行單元(Junit)測試。 我有一段Java代碼可以打開UDP套接字並向其中發送一些編碼數據。我正在編寫的測試將確保輸入的數據與輸出的“相同”數據相同。 因此,我將需要一側發送,而另一側接收。 由於UDP套接字的性質,不能打開偵聽同一端口號的多個套接字。 如果有人嘗試這樣做,他們將遇到以下異常:

java.net.BindException: Address already in use: Cannot bind

據我了解,通過UDP通過同一端口發送和接收都需要將相同的套接字用於這兩種功能。 如果我錯了,請糾正我。

我目前有兩個想法:

  1. 使用反射公開私有成員datagramSocketOut,然后將重用標志設置為true。 在這一點上,我會將這個套接字復制(和重用)到datagramSocketIn並從這個新端接收。 在我眼中,這看起來有點過時,而且聞起來很普通。

  2. 重構我的代碼以不再在內部創建新的套接字,而是在外部傳遞一個。 這將消除我正在測試的代碼中創建套接字的責任,並允許將相同的套接字重用於測試。

這是涉及UDP套接字的單元測試的推薦方法之一嗎? 還是我錯過了另一種方法?

編輯:為了與我有相同的誤解,他們應該知道UDP套接字可以為null構造DatagramSocket ds = new DatagramSocket(); 因此在實例化時未綁定到端口。 這樣可以避免讓兩個UDP套接字監聽同一端口。 為了簡潔起見,下面是一個代碼片段,它避免了我描述的問題。

socketOut = new DatagramSocket(PORT, addressOut);   
socketIn = new DatagramSocket(PORT+1); 
socketOut.send(new DatagramPacket(Payload, Payload.length, addressOut, PORT+1 )); 
socketIn.receive(new DatagramPacket(bufferIn, bufferIn.length));

您要測試的代碼應具有兩個用於端口的參數,一個用於綁定到本地端口的參數,一個用於發送到遠程端口的參數。 這樣,兩個端點都可以位於同一台計算機上。 然后,在單元測試代碼中,綁定到“遠程”端口並發送到“本地”端口。

例如,您的類設置為在端口7000上綁定並在端口7001上發送。因此,傳出數據包將具有源端口7000和目標端口7001。然后,您的單元測試代碼將在端口7001上綁定並在端口7000上發送。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM