繁体   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