我正在使用Netty' EmbeddedChannel来测试我的一些处理程序。
我有一个用例,我想测试我的处理程序根据#remoteAddress()来区分两个连接(通道)。
不幸的是,EmbeddedChannel使用EmbeddedSocketAddress,为每个创建的频道提供硬编码值。因此,两个不同的EmbeddedChannel个实例具有完全相同的#remoteAddress()。
我尝试 Spy 使用EmbeddedChannel并模拟出remoteAddress方法,但由于EmbeddedChannel实现,这不适用,因为在模拟发生之前创建了ChannelPipeline。因此,模拟的值不会在管道上传递,因为它具有对非模拟对象的引用。
有没有其他方法可以实现上述目标。理想情况下,我希望EmbeddedChannel的两个不同实例具有不同的#remoteAddress()。
谢谢。
答案 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;
}
}