12

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

我搜索了“netty unit test”,发现一篇文章说考虑CodecEmbedder,但我仍然不知道如何开始。您对如何对 Netty 代码进行单元测试有任何示例或建议吗?

非常感谢。

4

1 回答 1

18

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

测试 ChannelHandler

您可以使用 NettyEmbeddedChannel模拟 netty 连接进行测试,例如:

@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 的能力(来自我发布的这个 bug 的示例

您还可以使用 测试编码器方向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();
}

更多示例在 github 上。

字节缓冲区

要测试你是否使用你bytebuf的 s,你可以设置一个 JVM 参数来检查泄漏的 ByteBuf,为此,你应该添加-Dio.netty.leakDetectionLevel=PARANOID到启动参数中,或者调用方法ResourceLeakDetector.setLevel(PARANOID)

于 2016-01-14T12:46:15.283 回答