经过一些搜索,我没有遇到一个定义明确的解决方案来测试包含UDP套接字的Java(或任何!)代码的单元(Junit)。 我有一段Java代码打开UDP套接字并发送一些编码数据。我写的测试将确保进入的数据是"相同"数据出来了。因此,我需要发送一方,另一方接收。由于UDP套接字的性质,无法打开在同一端口号上侦听的多个套接字。如果有人试图这样做,他们会遇到这个例外:
java.net.BindException: Address already in use: Cannot bind
据我所知,通过UDP在同一端口上发送和接收需要使用相同的套接字来实现这两种功能。如果我错了,请纠正我。
目前我有两个想法:
使用反射公开私有成员datagramSocketOut,然后将reuse标志设置为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));
答案 0 :(得分:1)
您正在测试的代码应该有两个端口参数,一个用于绑定本地端口,另一个用于发送到的远程端口。这样,两个端点都可以在同一台机器上运行。然后在您的单元测试代码中,绑定到“远程”端口并发送到“本地”端口。
例如,您的类设置为在端口7000上绑定并在端口7001上发送。因此,传出的数据包将具有源端口7000和目标端口7001.您的单元测试代码将在端口7001上绑定并发送在7000港口。