对使用 UDP 套接字的单元测试代码的推荐方法是什么?
What is the recommended way to unit test code that uses UDP sockets?
经过一些搜索,我还没有找到包含 UDP 套接字的单元 (Junit) 测试 Java(或任何!)代码的定义明确的解决方案。
我有一段 Java 代码,它打开一个 UDP 套接字并发送一些编码数据。我正在编写的测试将确保输入的数据是输出的 "same" 数据。因此,我需要一侧发送,另一侧接收。由于 UDP 套接字的性质,一个人不能打开多个套接字监听同一个端口号。如果有人试图这样做,他们会遇到这个异常:
java.net.BindException: Address already in use: Cannot bind
据我了解,通过 UDP 通过同一端口发送和接收需要为这两种功能使用相同的套接字。如有不妥请指正
我目前有两个想法:
使用反射暴露私有成员datagramSocketOut,然后设置reuse flag为true。此时,我会将此套接字复制(并重复使用)到数据报 SocketIn 并从这个新端接收。在我看来,这看起来很简陋,而且闻起来很臭。
重构我的代码,不再在内部创建新的套接字,而是从外部传入一个套接字。这将从我正在测试的代码中删除创建套接字的责任,并允许重复使用相同的套接字进行测试。
这两种方法之一是涉及 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));
您正在测试的代码应该有两个端口参数,一个用于绑定到的本地端口,一个用于发送到的远程端口。这样,两个端点就可以存在于同一台机器上。然后在单元测试代码中,绑定到 "remote" 端口并发送到 "local" 端口。
例如,您的 class 设置为在端口 7000 上绑定并在端口 7001 上发送。因此传出数据包的源端口为 7000,目标端口为 7001。然后您的单元测试代码将在端口 7001 上绑定并在端口 7000 上发送。
经过一些搜索,我还没有找到包含 UDP 套接字的单元 (Junit) 测试 Java(或任何!)代码的定义明确的解决方案。 我有一段 Java 代码,它打开一个 UDP 套接字并发送一些编码数据。我正在编写的测试将确保输入的数据是输出的 "same" 数据。因此,我需要一侧发送,另一侧接收。由于 UDP 套接字的性质,一个人不能打开多个套接字监听同一个端口号。如果有人试图这样做,他们会遇到这个异常:
java.net.BindException: Address already in use: Cannot bind
据我了解,通过 UDP 通过同一端口发送和接收需要为这两种功能使用相同的套接字。如有不妥请指正
我目前有两个想法:
使用反射暴露私有成员datagramSocketOut,然后设置reuse flag为true。此时,我会将此套接字复制(并重复使用)到数据报 SocketIn 并从这个新端接收。在我看来,这看起来很简陋,而且闻起来很臭。
重构我的代码,不再在内部创建新的套接字,而是从外部传入一个套接字。这将从我正在测试的代码中删除创建套接字的责任,并允许重复使用相同的套接字进行测试。
这两种方法之一是涉及 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));
您正在测试的代码应该有两个端口参数,一个用于绑定到的本地端口,一个用于发送到的远程端口。这样,两个端点就可以存在于同一台机器上。然后在单元测试代码中,绑定到 "remote" 端口并发送到 "local" 端口。
例如,您的 class 设置为在端口 7000 上绑定并在端口 7001 上发送。因此传出数据包的源端口为 7000,目标端口为 7001。然后您的单元测试代码将在端口 7001 上绑定并在端口 7000 上发送。