Netty:测试 Encoder 和 Decoder

最近用了一段时间的Netty,现构建了一个编码器/解码器管道,以测试编码器和解码器在没有发送真实的消息时是否在正常工作。

方便的是,Netty 有个 EmbeddedChannel,使测试变得非常轻松。 

假设我们有一条消息“ Foo”,我们想通过网络发送。它仅包含一个整数值,因此我们将其发送并在另一侧重建“ Foo”。 我们可以编写以下编码器来执行此操作:

public static class MessageEncoder extends MessageToMessageEncoder<Foo>



{



    @Override



    protected void encode( ChannelHandlerContext ctx, Foo msg, List<Object> out ) throws Exception



    {



        ByteBuf buf = ctx.alloc().buffer();



        buf.writeInt( msg.value() );



        out.add( buf );



    }



}







public static class Foo



{



    private Integer value;







    public Foo(Integer value)



    {



        this.value = value;



    }







    public int value()



    {



        return value;



    }



}


因此,我们要做的就是从“ Foo”中拿到“ value”字段并将其放入列表,该列表会向下传递。 

编写一个测试,该测试模拟发送“ Foo”消息并使用空的解码器尝试处理该消息:

@Test



public void shouldEncodeAndDecodeVoteRequest()



{



    // given



    EmbeddedChannel channel = new EmbeddedChannel( new MessageEncoder(), new MessageDecoder() );







    // when



    Foo foo = new Foo( 42 );



    channel.writeOutbound( foo );



    channel.writeInbound( channel.readOutbound() );







    // then



    Foo returnedFoo = (Foo) channel.readInbound();



    assertNotNull(returnedFoo);



    assertEquals( foo.value(), returnedFoo.value() );



}







public static class MessageDecoder extends MessageToMessageDecoder<ByteBuf>



{



    @Override



    protected void decode( ChannelHandlerContext ctx, ByteBuf msg, List<Object> out ) throws Exception { }



}


在测试中,我们将“ Foo”写入出站通道,然后将其读回入站通道,然后检查我们所获得的内容。如果我们现在运行该测试,将会看到以下内容:

junit.framework.AssertionFailedError



at NettyTest.shouldEncodeAndDecodeVoteRequest(NettyTest.java:28)


我们返回的消息为空,这是有道理的,因为我们没有编写解码器。然后实现解码器:

public static class MessageDecoder extends MessageToMessageDecoder<ByteBuf>



{



    @Override



    protected void decode( ChannelHandlerContext ctx, ByteBuf msg, List<Object> out ) throws Exception



    {



        int value = msg.readInt();



        out.add( new Foo(value) );



    }



}


现在,如果我们再次运行测试,那一切就变成绿色。现在,我们可以对一些更复杂的结构进行编码/解码,并相应地更新测试。


 

展开阅读全文