经过一番搜索,我还没有找到一种定义明确的解决方案来对包含UDP套接字的Java(或任何!)代码进行单元(Junit)测试。
我有一段Java代码可以打开UDP套接字并向其中发送一些编码数据。我正在编写的测试将确保输入的数据与输出的“相同”数据相同。因此,我将需要一侧发送,而另一侧接收。由于UDP套接字的性质,不能打开侦听同一端口号的多个套接字。如果有人尝试这样做,他们将遇到以下异常:

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


据我了解,通过UDP通过同一端口发送和接收都需要将相同的套接字用于这两种功能。如果我错了,请纠正我。

我目前有两个想法:


使用反射公开私有成员datagramSocketOut,然后将重用标志设置为true。在这一点上,我会将这个套接字复制(和重用)到datagramSocketIn并从这个新端接收。在我眼中,这看起来有点过时,而且闻起来很普通。
重构我的代码以不再在内部创建新的套接字,而是在外部传递一个。这将消除我正在测试的代码中创建套接字的责任,并允许将相同的套接字重用于测试。


这是涉及UDP套接字的单元测试的推荐方法之一吗?还是我错过了另一种方法?

编辑:为了与我有相同的误解,他们应该知道UDP套接字可以为空构造的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上发送。

09-30 15:12
查看更多