【问题标题】:How to simulate an uncompleted Netty ChannelFuture如何模拟未完成的 Netty ChannelFuture
【发布时间】:2016-01-07 22:04:33
【问题描述】:

我正在使用 Netty 编写一个将 UDP 消息发送到服务器的客户端应用程序。简而言之,我正在使用这段代码将流写入通道:

ChannelFuture future = channel.write(request, remoteInetSocketAddress);
future.awaitUninterruptibly(timeout);
if(!future.isDone()){
   //abort logic
}

一切正常,但有一件事:我无法测试中止逻辑,因为我无法使写入失败 - 即即使服务器关闭,未来也会成功完成。写操作通常需要大约 1 毫秒,因此设置非常小的超时并没有太大帮助。

我知道首选的方法是使用异步模型而不是 await() 调用,但是对于我的场景,我需要它是同步的,并且我需要确保它在某个时候完成。

有谁知道我如何模拟一个未完成的未来?

提前非常感谢! 嗯

【问题讨论】:

    标签: udp netty


    【解决方案1】:

    根据您的代码编写方式,您可以使用 mockito 等模拟框架。如果这不可能,您还可以使用“已连接”的 UDP 套接字,即绑定到本地地址的数据报套接字。如果你发送到一个伪造的服务器,你应该得到 PortunreachableException 或类似的东西。

    【讨论】:

    • 是的,模拟可能是一种解决方案,但我希望看到未来未完成的真正原因。将数据包发送到伪造的服务器是行不通的 - 未来实际上已成功完成。
    • 再看你的例子,我发现上面的答案与问题并不相符。您确定要查看 isDone() 吗?如果为false,则仅表示写入操作未完成,可能仍然成功或不成功。我盲目地假设你的意思是 isSuccess()。在这种情况下,发送到“0.0.0.0”端口 1 会导致失败。
    • 感谢您的意见。是的,我确定我想看看 isDone()。实际上我有一个生产问题,我观察到 isDone() 在我的情况下返回 false。问题是我无法在测试环境中重现该问题。
    【解决方案2】:

    Netty 有一个 FailedFuture 类,可用于此目的,

    例如,您可以使用模拟以下内容的测试来模拟您的课程:

    ChannelFuture future;
    if(ALWAYS_FAIL) {
        future = channel.newFailedFuture(new Exception("I failed"));
    else
        future = channel.write(request, remoteInetSocketAddress);
    

    【讨论】: