gpt4 book ai didi

java - 对使用 UDP 套接字的代码进行单元测试的推荐方法是什么?

转载 作者:行者123 更新时间:2023-12-01 11:18:10 25 4
gpt4 key购买 nike

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

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

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

我现在有两个想法:

  1. 使用反射公开私有(private)成员datagramSocketOut,然后将重用标志设置为true。此时,我会将这个套接字复制(并重用)到 datagramSocketIn 并从这个新端接收。在我看来,这看起来相当简陋,而且味道很糟糕。

  2. 重构我的代码,不再在内部创建新的套接字,而是从外部传递一个。这将从我正在测试的代码中删除创建套接字的责任,并允许重复使用相同的套接字进行测试。

这两种方法之一是涉及 UDP 套接字的单元测试的推荐方法吗?或者我还缺少另一种方法吗?

编辑:为了那些和我有同样误解的人,他们应该知道 UDP 套接字可以是 null 构造的 DatagramSocket ds = new DatagramSocket(); 因此不绑定(bind)到实例化时的端口。这可以避免两个 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));

最佳答案

您正在测试的代码应该有两个端口参数,一个用于绑定(bind)到的本地端口,一个用于发送到的远程端口。这样,两个端点就可以位于同一台机器上。然后在单元测试代码中,绑定(bind)到“远程”端口并发送到“本地”端口。

例如,您的类设置为绑定(bind)在端口 7000 上并在端口 7001 上发送。因此传出数据包的源端口为 7000,目标端口为 7001。然后您的单元测试代码将绑定(bind)在端口 7001 上并发送在端口 7000 上。

关于java - 对使用 UDP 套接字的代码进行单元测试的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31546374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com