2017-01-02 7 views
0

Я использую Netty's EmbeddedChannel, чтобы проверить некоторые из моих обработчиков.Netty EmbeddedChannel, имитирующий два разных соединения

У меня есть вариант использования, где я хочу проверить, что мой обработчик различает два соединения (каналы), основанные на их #remoteAddress().

К сожалению, EmbeddedChannel использует EmbeddedSocketAddress, что обеспечивает жестко заданное значение для каждого созданного канала. Следовательно, два разных экземпляра EmbeddedChannel имеют то же самое #remoteAddress().

Я попытался Spy в EmbeddedChannel и издеваться способом remoteAddress, но из-за реализации EmbeddedChannel это не относится, как ChannelPipeline создается до насмешки происходит. Следовательно, издеваемое значение не передается по конвейеру, так как оно имеет ссылку на не издевавшийся объект.

Есть ли альтернатива тому, как достичь вышеуказанного. В идеале я хотел бы, чтобы два разных экземпляра EmbeddedChannel имели разные #remoteAddress().

спасибо.

ответ

0

Возможно, вы можете попробовать использовать идентификатор канала?

см http://netty.io/4.1/api/io/netty/channel/AbstractChannel.html#id()

Конечно, это приведет к не вести себя, как ваш текущий код на основе удаленного адреса. Однако в некоторых случаях базы данных на удаленном адресе могут быть недостаточными (например, если реальный пульт находится за прокси-сервером). Так может быть, вы могли бы рассмотреть 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; 
    } 
}