Netty EmbeddedChannel模拟两个不同的连接

时间:2017-01-02 17:04:02

标签: java netty nio

我正在使用Netty' EmbeddedChannel来测试我的一些处理程序。

我有一个用例,我想测试我的处理程序根据#remoteAddress()来区分两个连接(通道)。

不幸的是,EmbeddedChannel使用EmbeddedSocketAddress,为每个创建的频道提供硬编码值。因此,两个不同的EmbeddedChannel个实例具有完全相同的#remoteAddress()

我尝试 Spy 使用EmbeddedChannel并模拟出remoteAddress方法,但由于EmbeddedChannel实现,这不适用,因为在模拟发生之前创建了ChannelPipeline。因此,模拟的值不会在管道上传递,因为它具有对非模拟对象的引用。

有没有其他方法可以实现上述目标。理想情况下,我希望EmbeddedChannel的两个不同实例具有不同的#remoteAddress()

谢谢。

2 个答案:

答案 0 :(得分:0)

也许您可以尝试使用频道的ID?

请参阅http://netty.io/4.1/api/io/netty/channel/AbstractChannel.html#id()

当然,这将导致您的当前代码不能基于远程地址。但是,在某些情况下,仅基于远程地址可能还不够(例如,如果真正的远程位于代理后面)。所以也许你可以考虑在"正常"情况呢?

答案 1 :(得分:0)

您可以尝试创建一个扩展EmbeddedChannel的自定义渠道,然后覆盖protected SocketAddress remoteAddress0()以返回您想要的地址。

这样的事情应该做

public class CustomEmbeddedChannel extends EmbeddedChannel{

    private InetSocketAddress socketAddress;

    public CustomEmbeddedChannel(String host, int port, final ChannelHandler ... handlers){
        super(handlers);
        socketAddress = new InetSocketAddress(host, port);
    }

    @Override
    protected SocketAddress remoteAddress0(){
        return this.socketAddress;
    }
}