如何对netty处理程序进行单元测试

时间:2013-10-11 07:13:46

标签: unit-testing netty

我实现了一个扩展SimpleChannelHandler的处理程序,并覆盖了一些方法,如channelConnected,messageReceived。但是,我想知道如何进行单元测试呢?

我搜索了“网络单元测试”并找到了考虑CodecEmbedder的one article,但我仍然不确定如何开始。您对如何对Netty代码进行单元测试有任何示例或建议吗?

非常感谢。

1 个答案:

答案 0 :(得分:15)

在Netty中,有不同的方法来测试你的网络堆栈。

测试ChannelHandlers

您可以使用Netty的EmbeddedChannel模拟网络连接进行测试,例如:

@Test
public void nettyTest() {
    EmbeddedChannel channel = new EmbeddedChannel(new StringDecoder(StandardCharsets.UTF_8));
    channel.writeInbound(Unpooled.wrappedBuffer(new byte[]{(byte)0xE2,(byte)0x98,(byte)0xA2}));
    String myObject = channel.readInbound();
    // Perform checks on your object
    assertEquals("☢", myObject);
}

上面的测试测试了StringDecoder解码unicode的能力正确(example from this bug posted by me

您还可以使用EmbeddedChannel测试编码器方向,为此您应使用writeOutBoundreadInbound

更多示例:

DelimiterBasedFrameDecoderTest.java

@Test
public void testIncompleteLinesStrippedDelimiters() {
    EmbeddedChannel ch = new EmbeddedChannel(new DelimiterBasedFrameDecoder(8192, true,
            Delimiters.lineDelimiter()));
    ch.writeInbound(Unpooled.copiedBuffer("Test", Charset.defaultCharset()));
    assertNull(ch.readInbound());
    ch.writeInbound(Unpooled.copiedBuffer("Line\r\ng\r\n", Charset.defaultCharset()));
    assertEquals("TestLine", releaseLater((ByteBuf) ch.readInbound()).toString(Charset.defaultCharset()));
    assertEquals("g", releaseLater((ByteBuf) ch.readInbound()).toString(Charset.defaultCharset()));
    assertNull(ch.readInbound());
    ch.finish();
}

More examples on github.

ByteBuf

要测试您是否使用bytebuf,可以设置一个JVM参数来检查泄漏的ByteBuf,为此,您应该将-Dio.netty.leakDetectionLevel=PARANOID添加到启动参数,或者调用方法{{ 1}}。