2017-01-02 34 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; 
    } 
}