2017-01-02 1 views
0

Ich benutze Nettys EmbeddedChannel, um einige meiner Handler zu testen.Netty EmbeddedChannel simuliert zwei verschiedene Verbindungen

Ich habe einen Anwendungsfall, wo ich testen möchte, dass mein Handler zwischen zwei Verbindungen (Kanäle) unterscheidet, basierend auf ihrer #remoteAddress().

Leider verwendet EmbeddedChannelEmbeddedSocketAddress, die einen fest codierten Wert für jeden erstellten Kanal bereitstellt. Daher haben zwei verschiedene EmbeddedChannel Instanzen genau die gleichen #remoteAddress().

Ich habe versucht, zu Spy die EmbeddedChannel und die remote Methode verspotten, aber wegen der EmbeddedChannel Implementierung dies nicht als ChannelPipeline gilt erstellt wird, bevor die spöttischen stattfindet. Daher wird der mocked Wert nicht an die Pipeline übergeben, da es einen Verweis auf das nicht gespottete Objekt hat.

Gibt es eine Alternative, wie Sie das oben genannte erreichen können? Idealerweise möchte ich, dass zwei verschiedene Instanzen von EmbeddedChannel unterschiedliche #remoteAddress() haben.

Vielen Dank.

Antwort

0

Vielleicht können Sie versuchen, die ID des Kanals zu verwenden?

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

Natürlich ist dies nicht so tun, als Ihr aktueller Code auf Basis von Remote-Adresse führen wird. Allerdings kann es in einigen Fällen nicht ausreichen, nur auf Remote Address zu basieren (zum Beispiel, wenn sich die echte Fernbedienung hinter einem Proxy befindet). Vielleicht könntest du ID auch in "normaler" Situation betrachten?

0

Sie können versuchen, einen benutzerdefinierten Kanal zu erstellen, der EmbeddedChannel erweitert, und dann protected SocketAddress remoteAddress0() überschreiben, um die gewünschte Adresse zurückzugeben.

So etwas sollte

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; 
    } 
} 
tun
Verwandte Themen