2017-01-02 66 views
0

我使用Netty的EmbeddedChannel来测试我的一些处理程序。模拟两个不同连接的Netty EmbeddedChannel

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

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

我试图间谍的EmbeddedChannel和模拟出remoteAddress方法,但由于EmbeddedChannel实现的,这并不为ChannelPipeline应用嘲讽发生之前创建。因此,模拟值不会在管道上传递,因为它具有对非模拟对象的引用。

如何实现上述目标是否有其他选择。理想情况下,我希望EmbeddedChannel的两个不同实例具有不同的#remoteAddress()

谢谢。

回答

0

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

看到http://netty.io/4.1/api/io/netty/channel/AbstractChannel.html#id()

当然,这将导致基于远程地址不会像你当前的代码。但是,仅基于远程地址在某些情况下可能不够(例如,如果真正的远程地址在代理之后)。那么也许你可以在“正常”情况下考虑身份证?

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; 
    } 
}